All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.maizegenetics.analysis.modelfitter.StepwiseAdditiveModelFitterPlugin Maven / Gradle / Ivy

Go to download

TASSEL is a software package to evaluate traits associations, evolutionary patterns, and linkage disequilibrium.

There is a newer version: 5.2.94
Show newest version
package net.maizegenetics.analysis.modelfitter;

import java.awt.Frame;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import javax.swing.ImageIcon;

import net.maizegenetics.matrixalgebra.Matrix.DoubleMatrixFactory;
import org.apache.log4j.Logger;


import net.maizegenetics.analysis.modelfitter.AdditiveSite.CRITERION;
import net.maizegenetics.dna.snp.GenotypeTable;
import net.maizegenetics.dna.snp.GenotypeTable.GENOTYPE_TABLE_COMPONENT;
import net.maizegenetics.phenotype.GenotypePhenotype;
import net.maizegenetics.phenotype.Phenotype;
import net.maizegenetics.phenotype.Phenotype.ATTRIBUTE_TYPE;
import net.maizegenetics.phenotype.PhenotypeAttribute;
import net.maizegenetics.phenotype.PhenotypeUtils;
import net.maizegenetics.plugindef.AbstractPlugin;
import net.maizegenetics.plugindef.DataSet;
import net.maizegenetics.plugindef.Datum;
import net.maizegenetics.plugindef.PluginParameter;
import net.maizegenetics.plugindef.GeneratePluginCode;
import net.maizegenetics.util.TableReport;
import net.maizegenetics.util.TableReportUtils;

public class StepwiseAdditiveModelFitterPlugin extends AbstractPlugin {
    //needs to set the following parameters in StepwiseAdditiveModelFitter:
    //    private int numberOfPermutations = 1000;
    //    private double permutationAlpha = 0.05;
    //    private double enterLimit = 1e-5;
    //    private double exitLimit = 2e-5;
    //    private boolean useReferenceProbability = true;
    //    private boolean isNested = true;
    //    private String nestingEffectName = "family";
    //    private AdditiveSite.CRITERION modelSelectionCriterion = AdditiveSite.CRITERION.pval;
    //    private int maxSitesInModel = 1000;
    private static Logger myLogger = Logger.getLogger(StepwiseAdditiveModelFitterPlugin.class);
    private List myFactorNameList;
    private GenotypePhenotype myGenoPheno;
    private String datasetName;

    private PluginParameter modelCriterion =
            new PluginParameter.Builder<>("criterion", AdditiveSite.CRITERION.pval, AdditiveSite.CRITERION.class)
                    .range(AdditiveSite.CRITERION.values())
                    .guiName("Model selection criterion")
                    .description("The model selection criterion used to determine which terms enter the model and how many. Value must be one of pval, bic, mbic, or aic")
                    .build();

    private PluginParameter useResiduals =
            new PluginParameter.Builder<>("useResidual", false, Boolean.class)
                    .description("Should the each new term be tested using residuals from the previous model instead of fitting a complete model each time?")
                    .guiName("Fit using residuals")
                    .build();

    private PluginParameter usePermutations =
            new PluginParameter.Builder<>("usePerm", true, Boolean.class)
                    .description("Should permutations be used to set the enter and exit limits for stepwise regression? A permutation test will be used to determine the enter limit. The exit limit will be set to 2 times the enter limit.")
                    .guiName("Use permutations")
                    .build();

    private PluginParameter numberOfPermutations =
            new PluginParameter.Builder<>("nPerm", 1000, Integer.class)
                    .description("The number of permutations used to determine the enter limit.")
                    .guiName("Number of permutations")
                    .dependentOnParameter(usePermutations)
                    .build();

    private PluginParameter permutationAlpha =
            new PluginParameter.Builder<>("permAlpha", 0.05, Double.class)
                    .description("Type I errors will be controlled at this level.")
                    .guiName("Alpha for permutations")
                    .dependentOnParameter(usePermutations)
                    .build();

    private PluginParameter enterLimit =
            new PluginParameter.Builder<>("enterLimit", 1e-5, Double.class)
                    .description("When p-value is the model selection criteria, model fitting will stop when the next term chosen has a p-value greater than the enterLimit. This value will be over-ridden the permutation test, if used.")
                    .guiName("enterLimit")
                    .dependentOnParameter(usePermutations, false)
                    .build();

    private PluginParameter exitLimit =
            new PluginParameter.Builder<>("exitLimit", 2e-5, Double.class)
                    .description("During the backward step of model fitting if p-value has been chosen as the selection criterion, if the term in model with the highest p-value has a p-value > exitLimit, it will be removed from the model.")
                    .guiName("exitLimit")
                    .dependentOnParameter(usePermutations, false)
                    .build();

    private PluginParameter maxTerms =
            new PluginParameter.Builder<>("maxterms", 1000, Integer.class)
                    .description("The maximum number of SNPs/markers that will be fit. If the model selection criterion is met first, then the fitting process will stop at that point.")
                    .guiName("Max SNPs/markers")
                    .build();

    private PluginParameter isNested =
            new PluginParameter.Builder<>("isNested", true, Boolean.class)
                    .description("Should SNPs/markers be nested within a factor, such as family?")
                    .guiName("")
                    .build();

    private PluginParameter nestingFactor =
            new PluginParameter.Builder<>("nestFactor", null, String.class)
                    .guiName("Nesting factor")
                    .description("Nest markers within this factor. This parameter cannot be set from the command line. Instead, the first factor in the data set will be used.")
                    .dependentOnParameter(isNested)
                    .objectListSingleSelect()
                    .build();

    private PluginParameter myGenotypeTable =
            new PluginParameter.Builder<>("genotypeComponent", GenotypeTable.GENOTYPE_TABLE_COMPONENT.Genotype, GenotypeTable.GENOTYPE_TABLE_COMPONENT.class)
                    .genotypeTable()
                    .range(GenotypeTable.GENOTYPE_TABLE_COMPONENT.values())
                    .description("If the genotype table contains more than one type of genotype data, choose the type to use for the analysis.")
                    .build();

    private PluginParameter createAnova =
            new PluginParameter.Builder<>("anova", true, Boolean.class)
                    .description("Create pre- and post-scan anova reports.")
                    .guiName("Create anova reports")
                    .build();

    private PluginParameter createEffects =
            new PluginParameter.Builder<>("effects", true, Boolean.class)
                    .description("Create a report of marker effects based on the scan results.")
                    .guiName("Create effects report")
                    .build();

    private PluginParameter createEffectsPrescan =
            new PluginParameter.Builder<>("effectsPrescan", false, Boolean.class)
                    .description("Create a report of marker effects based on the results pre-scan.")
                    .guiName("Create prescan effects")
                    .build();

    private PluginParameter createStep =
            new PluginParameter.Builder<>("step", true, Boolean.class)
                    .description("Create a report of the which markers enter and leave the model as it is being fit.")
                    .guiName("Create step report")
                    .build();

    private PluginParameter createResiduals =
            new PluginParameter.Builder<>("residuals", false, Boolean.class)
                    .description("Create a phenotype dataset of model residuals for each chromosome. For each chromosome, the residuals will be calculated from a model with all terms EXCEPT the markers on that chromosome.")
                    .guiName("Create residuals")
                    .build();

    private PluginParameter writeFiles =
            new PluginParameter.Builder<>("saveToFile", false, Boolean.class)
                    .description("Should the requested output be written to files?")
                    .guiName("Write to files")
                    .build();

    private PluginParameter outputName =
            new PluginParameter.Builder<>("savePath", "", String.class)
                    .description("The base file path for the save files. Each file saved will add a descriptive name to the base name.")
                    .guiName("Base file path")
                    .outFile()
                    .dependentOnParameter(writeFiles)
                    .build();

    private PluginParameter fitAddDom =
            new PluginParameter.Builder<>("addDom", false, Boolean.class)
                    .description("Should the plugin fit an additive plus dominance model? If false, an additive only model will be fit. Note this option does not implement a nested model. The isNested parameter will be ignored.")
                    .guiName("Fit AddDom Model")
                    .build();

    private PluginParameter minHets =
            new PluginParameter.Builder<>("minHets", 20, Integer.class)
                    .dependentOnParameter(fitAddDom)
                    .description("The minimum number of individuals that are heterozygous at a site for the dominance term to be included. If the number of hets is less than minHets at a site, an additive only model will be fit for that site.")
                    .guiName("Minimum number of heterozygotes")
                    .build();

    private PluginParameter imputedDominance =
            new PluginParameter.Builder<>("imputeDom", true, Boolean.class)
                    .description("Should the plugin impute a value for dominance if data is missing. If false, the dominance score in the design matrix will be 0 for missing genotypes.")
                    .guiName("Impute Dominance Score")
                    .build();

    public StepwiseAdditiveModelFitterPlugin() {
        super(null, false);
    }

    public StepwiseAdditiveModelFitterPlugin(Frame parentFrame, boolean isInteractive) {
        super(parentFrame, isInteractive);
    }

    @Override
    public String pluginDescription() {
        return "A stepwise model fitter designed to select variants tested for association with a large " +
                "number of nucleotide variants. It can be multi-threaded to handle large number of variants efficiently. " +
                "It can fit an additive only model or an additive + dominance model.";
    }

    @Override
    protected void preProcessParameters(DataSet input) {
        DoubleMatrixFactory.setDefault(DoubleMatrixFactory.FactoryType.ejml);
        //input data should be a single GenotypePhenotype
        List datumList = input.getDataOfType(GenotypePhenotype.class);
        if (datumList.size() != 1)
            throw new IllegalArgumentException("Choose exactly one dataset that has combined genotype and phenotype data.");
        myGenoPheno = (GenotypePhenotype) datumList.get(0).getData();
        datasetName = datumList.get(0).getName();

        myFactorNameList =
                myGenoPheno.phenotype().attributeListOfType(ATTRIBUTE_TYPE.factor).stream()
                        .map(pa -> pa.name())
                        .collect(Collectors.toList());

        if (myFactorNameList.isEmpty()) myFactorNameList.add("None");
        nestingFactor = new PluginParameter<>(nestingFactor, myFactorNameList);
    }

    @Override
    protected void postProcessParameters() {
        if (isNested.value()) {
            if (myFactorNameList.size() > 1 && nestingFactor.value().isEmpty()) throw new IllegalArgumentException("Is Nested was checked but no nesting factor was selected."); 
        }
    }

    @Override
    public DataSet processData(DataSet input) {
        StepwiseAdditiveModelFitter stamFitter;
        if (fitAddDom.value()) {
            stamFitter = new StepwiseAddDomModelFitter(myGenoPheno, datasetName);
            //initialize constants
            AddPlusDomModelEffect.MIN_HETS = minHets.value();
            AddPlusDomModelEffect.IMPUTE_DOM = imputedDominance.value();

        } else {
            stamFitter = new StepwiseAdditiveModelFitter(myGenoPheno, datasetName);
        }

        //set parameters
        if (usePermutations.value()) {
            stamFitter.numberOfPermutations(numberOfPermutations.value().intValue());
            stamFitter.permutationAlpha(permutationAlpha.value());
        } else {
            stamFitter.enterLimit(enterLimit.value());
            stamFitter.exitLimit(exitLimit.value());
        }

        if (myGenotypeTable.value() == GenotypeTable.GENOTYPE_TABLE_COMPONENT.ReferenceProbability)
            stamFitter.useReferenceProbability(true);
        else if (myGenoPheno.genotypeTable().hasGenotype() == false
                && myGenoPheno.genotypeTable().hasReferenceProbablity() == true)
            stamFitter.useReferenceProbability(true);
        else
            stamFitter.useReferenceProbability(false);

        if (isNested.value()) {
            if (isInteractive()) {
                String nestingList = nestingFactor.value();
                if (nestingList.isEmpty()) {
                    if (myFactorNameList.get(0).equals("None")) {
                        stamFitter.isNested(false);
                    } else {
                        stamFitter.isNested(true);
                        stamFitter.nestingEffectName(nestingList);
                    }
                } else {
                    String factorName = nestingList;
                    if (factorName.equals("None"))
                        stamFitter.isNested(false);
                    else {
                        stamFitter.isNested(true);
                        stamFitter.nestingEffectName(factorName);
                    }
                }
            } else {
                List factorList = myGenoPheno.phenotype().attributeListOfType(ATTRIBUTE_TYPE.factor);
                if (factorList.isEmpty()) stamFitter.isNested(false);
                else {
                    stamFitter.isNested(true);
                    stamFitter.nestingEffectName(factorList.get(0).name());
                }
            }

        } else {
            stamFitter.isNested(false);
        }

        stamFitter.enterLimit(enterLimit.value());
        stamFitter.exitLimit(exitLimit.value());
        stamFitter.maxSitesInModel(maxTerms.value());
        stamFitter.modelSelectionCriterion(modelCriterion.value());
        stamFitter.createAnovaReport(createAnova.value());
        stamFitter.createPostScanEffectsReport(createEffects.value());
        stamFitter.createPreScanEffectsReport(createEffectsPrescan.value());
        stamFitter.createResidualsByChr(createResiduals.value());
        stamFitter.createStepReport(createStep.value());

        long start = System.nanoTime();
        stamFitter.runAnalysis();
        myLogger.debug(String.format("ran analysis in %d ms.",  (System.nanoTime() - start)/1000000));
        
        List resultData = new ArrayList<>();
        if (createStep.value()) {
            String name = "Steps_" + datasetName;
            String comment = "Stepwise regression results:\nModel fitting steps\n";
            TableReport output = stamFitter.getSteps();
            resultData.add(new Datum(name, output, comment));

            if (writeFiles.value()) {
                String filename = outputName.value() + "_steps.txt";
                TableReportUtils.saveDelimitedTableReport(output, new File(filename));
            }
        }
        if (createAnova.value()) {
            TableReport output1 = stamFitter.getAnovaReport();
            String name = "Prescan_anova_" + datasetName;
            String comment = "Stepwise regression results:\nAnova for the initial model prior to rescanning\n";
            resultData.add(new Datum(name, output1, comment));

            TableReport output2 = stamFitter.getAnovaReportWithCI();
            name = "Anova_" + datasetName;
            comment = "Stepwise regression results:\nAnova for the final model with support intervals\n";
            resultData.add(new Datum(name, output2, comment));

            if (writeFiles.value()) {
                String filename = outputName.value() + "_prescan_anova.txt";
                TableReportUtils.saveDelimitedTableReport(output1, new File(filename));
                filename = outputName.value() + "_anova.txt";
                TableReportUtils.saveDelimitedTableReport(output2, new File(filename));
            }
        }
        if (createEffectsPrescan.value()) {
            String name = "Prescan_effects_" + datasetName;
            String comment = "Stepwise regression results:\nMarker effects estimated from the initial model before rescanning\n";
            TableReport output = stamFitter.getMarkerEffectReport();
            resultData.add(new Datum(name, output, comment));

            if (writeFiles.value()) {
                String filename = outputName.value() + "_prescan_effects.txt";
                TableReportUtils.saveDelimitedTableReport(output, new File(filename));
            }
        }
        if (createEffects.value()) {
            String name = "Effects_regression_" + datasetName;
            String comment = "Stepwise regression results:\nMarker effects estimated from the final model\n";
            TableReport output = stamFitter.getMarkerEffectReportWithCI();
            resultData.add(new Datum(name, output, comment));

            if (writeFiles.value()) {
                String filename = outputName.value() + "_effects.txt";
                TableReportUtils.saveDelimitedTableReport(output, new File(filename));
            }
        }
        if (createResiduals.value()) {
            List phenoList = stamFitter.getResidualPhenotypesByChromosome();
            phenoList.stream().forEach(pheno -> {
                String traitname = pheno.attributeName(pheno.numberOfAttributes() - 1);
                String name = "Residuals_" + traitname + "_" + datasetName;
                String comment = "Stepwise regression results:\nResiduals for " + traitname + "\n";
                resultData.add(new Datum(name, pheno, comment));
            });

            if (writeFiles.value()) {
                phenoList.stream().forEach(pheno -> {
                    String traitname = pheno.attributeName(pheno.numberOfAttributes() - 1);
                    String filename = outputName.value() + "_" + traitname + ".txt";
                    PhenotypeUtils.write(pheno, filename);
                });
            }
        }

        return new DataSet(resultData, this);
    }

    @Override
    public ImageIcon getIcon() {
        URL imageURL = StepwiseOLSModelFitterPlugin.class.getResource("stepwise.gif");
        if (imageURL == null) {
            return null;
        } else {
            return new ImageIcon(imageURL);
        }
    }

    @Override
    public String getButtonName() {
        return "Stepwise-Multithread";
    }

    @Override
    public String getToolTipText() {
        return "Fit a model using stepwise forward-backward regression.";
    }

//      The following getters and setters were auto-generated.
//      Please use this method to re-generate.

//      public static void main(String[] args) {
//          GeneratePluginCode.generate(StepwiseAdditiveModelFitterPlugin.class);
//      }

     /**
      * The model selection criterion used to determine which
      * terms enter the model and how many. Value must be one
      * of pval, bic, mbic, or aic
      *
      * @return Model selection criterion
      */
     public CRITERION modelCriterion() {
         return modelCriterion.value();
     }

     /**
      * Set Model selection criterion. The model selection
      * criterion used to determine which terms enter the model
      * and how many. Value must be one of pval, bic, mbic,
      * or aic
      *
      * @param value Model selection criterion
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin modelCriterion(CRITERION value) {
         modelCriterion = new PluginParameter<>(modelCriterion, value);
         return this;
     }

     /**
      * Should the each new term be tested using residuals
      * from the previous model instead of fitting a complete
      * model each time?
      *
      * @return Fit using residuals
      */
     public Boolean useResiduals() {
         return useResiduals.value();
     }

     /**
      * Set Fit using residuals. Should the each new term be
      * tested using residuals from the previous model instead
      * of fitting a complete model each time?
      *
      * @param value Fit using residuals
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin useResiduals(Boolean value) {
         useResiduals = new PluginParameter<>(useResiduals, value);
         return this;
     }

     /**
      * Should permutations be used to set the enter and exit
      * limits for stepwise regression? A permutation test
      * will be used to determine the enter limit. The exit
      * limit will be set to 2 times the enter limit.
      *
      * @return Use permutations
      */
     public Boolean usePermutations() {
         return usePermutations.value();
     }

     /**
      * Set Use permutations. Should permutations be used to
      * set the enter and exit limits for stepwise regression?
      * A permutation test will be used to determine the enter
      * limit. The exit limit will be set to 2 times the enter
      * limit.
      *
      * @param value Use permutations
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin usePermutations(Boolean value) {
         usePermutations = new PluginParameter<>(usePermutations, value);
         return this;
     }

     /**
      * The number of permutations used to determine the enter
      * limit.
      *
      * @return Number of permutations
      */
     public Integer numberOfPermutations() {
         return numberOfPermutations.value();
     }

     /**
      * Set Number of permutations. The number of permutations
      * used to determine the enter limit.
      *
      * @param value Number of permutations
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin numberOfPermutations(Integer value) {
         numberOfPermutations = new PluginParameter<>(numberOfPermutations, value);
         return this;
     }

     /**
      * Type I errors will be controlled at this level.
      *
      * @return Alpha for permutations
      */
     public Double permutationAlpha() {
         return permutationAlpha.value();
     }

     /**
      * Set Alpha for permutations. Type I errors will be controlled
      * at this level.
      *
      * @param value Alpha for permutations
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin permutationAlpha(Double value) {
         permutationAlpha = new PluginParameter<>(permutationAlpha, value);
         return this;
     }

     /**
      * When p-value is the model selection criteria, model
      * fitting will stop when the next term chosen has a p-value
      * greater than the enterLimit. This value will be over-ridden
      * the permutation test, if used.
      *
      * @return enterLimit
      */
     public Double enterLimit() {
         return enterLimit.value();
     }

     /**
      * Set enterLimit. When p-value is the model selection
      * criteria, model fitting will stop when the next term
      * chosen has a p-value greater than the enterLimit. This
      * value will be over-ridden the permutation test, if
      * used.
      *
      * @param value enterLimit
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin enterLimit(Double value) {
         enterLimit = new PluginParameter<>(enterLimit, value);
         return this;
     }

     /**
      * During the backward step of model fitting if p-value
      * has been chosen as the selection criterion, if the
      * term in model with the highest p-value has a p-value
      * > exitLimit, it will be removed from the model.
      *
      * @return exitLimit
      */
     public Double exitLimit() {
         return exitLimit.value();
     }

     /**
      * Set exitLimit. During the backward step of model fitting
      * if p-value has been chosen as the selection criterion,
      * if the term in model with the highest p-value has a
      * p-value > exitLimit, it will be removed from the model.
      *
      * @param value exitLimit
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin exitLimit(Double value) {
         exitLimit = new PluginParameter<>(exitLimit, value);
         return this;
     }

     /**
      * The maximum number of SNPs/markers that will be fit.
      * If the model selection criterion is met first, then
      * the fitting process will stop at that point.
      *
      * @return Max SNPs/markers
      */
     public Integer maxTerms() {
         return maxTerms.value();
     }

     /**
      * Set Max SNPs/markers. The maximum number of SNPs/markers
      * that will be fit. If the model selection criterion
      * is met first, then the fitting process will stop at
      * that point.
      *
      * @param value Max SNPs/markers
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin maxTerms(Integer value) {
         maxTerms = new PluginParameter<>(maxTerms, value);
         return this;
     }

     /**
      * Should SNPs/markers be nested within a factor, such
      * as family?
      *
      * @return Is Nested
      */
     public Boolean isNested() {
         return isNested.value();
     }

     /**
      * Set Is Nested. Should SNPs/markers be nested within
      * a factor, such as family?
      *
      * @param value Is Nested
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin isNested(Boolean value) {
         isNested = new PluginParameter<>(isNested, value);
         return this;
     }

     /**
      * Nest markers within this factor. This parameter cannot
      * be set from the command line. Instead, the first factor
      * in the data set will be used.
      *
      * @return Nesting factor
      */
     public String nestingFactor() {
         return nestingFactor.value();
     }

     /**
      * Set Nesting factor. Nest markers within this factor.
      * This parameter cannot be set from the command line.
      * Instead, the first factor in the data set will be used.
      *
      * @param value Nesting factor
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin nestingFactor(List value) {
         nestingFactor = new PluginParameter<>(nestingFactor, value);
         return this;
     }

     /**
      * If the genotype table contains more than one type of
      * genotype data, choose the type to use for the analysis.
      *
      * @return Genotype Component
      */
     public GENOTYPE_TABLE_COMPONENT genotypeTable() {
         return myGenotypeTable.value();
     }

     /**
      * Set Genotype Component. If the genotype table contains
      * more than one type of genotype data, choose the type
      * to use for the analysis.
      *
      * @param value Genotype Component
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin genotypeTable(GENOTYPE_TABLE_COMPONENT value) {
         myGenotypeTable = new PluginParameter<>(myGenotypeTable, value);
         return this;
     }

     /**
      * Create pre- and post-scan anova reports.
      *
      * @return Create anova reports
      */
     public Boolean createAnova() {
         return createAnova.value();
     }

     /**
      * Set Create anova reports. Create pre- and post-scan
      * anova reports.
      *
      * @param value Create anova reports
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin createAnova(Boolean value) {
         createAnova = new PluginParameter<>(createAnova, value);
         return this;
     }

     /**
      * Create a report of marker effects based on the scan
      * results.
      *
      * @return Create effects report
      */
     public Boolean createEffects() {
         return createEffects.value();
     }

     /**
      * Set Create effects report. Create a report of marker
      * effects based on the scan results.
      *
      * @param value Create effects report
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin createEffects(Boolean value) {
         createEffects = new PluginParameter<>(createEffects, value);
         return this;
     }

     /**
      * Create a report of marker effects based on the results
      * pre-scan.
      *
      * @return Create prescan effects
      */
     public Boolean createEffectsPrescan() {
         return createEffectsPrescan.value();
     }

     /**
      * Set Create prescan effects. Create a report of marker
      * effects based on the results pre-scan.
      *
      * @param value Create prescan effects
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin createEffectsPrescan(Boolean value) {
         createEffectsPrescan = new PluginParameter<>(createEffectsPrescan, value);
         return this;
     }

     /**
      * Create a report of the which markers enter and leave
      * the model as it is being fit.
      *
      * @return Create step report
      */
     public Boolean createStep() {
         return createStep.value();
     }

     /**
      * Set Create step report. Create a report of the which
      * markers enter and leave the model as it is being fit.
      *
      * @param value Create step report
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin createStep(Boolean value) {
         createStep = new PluginParameter<>(createStep, value);
         return this;
     }

     /**
      * Create a phenotype dataset of model residuals for each
      * chromosome. For each chromosome, the residuals will
      * be calculated from a model with all terms EXCEPT the
      * markers on that chromosome.
      *
      * @return Create residuals
      */
     public Boolean createResiduals() {
         return createResiduals.value();
     }

     /**
      * Set Create residuals. Create a phenotype dataset of
      * model residuals for each chromosome. For each chromosome,
      * the residuals will be calculated from a model with
      * all terms EXCEPT the markers on that chromosome.
      *
      * @param value Create residuals
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin createResiduals(Boolean value) {
         createResiduals = new PluginParameter<>(createResiduals, value);
         return this;
     }

     /**
      * Should the requested output be written to files?
      *
      * @return Write to files
      */
     public Boolean writeFiles() {
         return writeFiles.value();
     }

     /**
      * Set Write to files. Should the requested output be
      * written to files?
      *
      * @param value Write to files
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin writeFiles(Boolean value) {
         writeFiles = new PluginParameter<>(writeFiles, value);
         return this;
     }

     /**
      * The base file path for the save files. Each file saved
      * will add a descriptive name to the base name.
      *
      * @return Base file path
      */
     public String outputName() {
         return outputName.value();
     }

     /**
      * Set Base file path. The base file path for the save
      * files. Each file saved will add a descriptive name
      * to the base name.
      *
      * @param value Base file path
      *
      * @return this plugin
      */
     public StepwiseAdditiveModelFitterPlugin outputName(String value) {
         outputName = new PluginParameter<>(outputName, value);
         return this;
     }

    /**
     * Should the plugin fit an additive plus dominance model?
     * If false, an additive only model will be fit. Note
     * this option does not implement a nested model. The
     * isNested parameter will be ignored.
     *
     * @return Fit AddDom Model
     */
    public Boolean fitAddDom() {
        return fitAddDom.value();
    }

    /**
     * Set Fit AddDom Model. Should the plugin fit an additive
     * plus dominance model? If false, an additive only model
     * will be fit. Note this option does not implement a
     * nested model. The isNested parameter will be ignored.
     *
     * @param value Fit AddDom Model
     *
     * @return this plugin
     */
    public StepwiseAdditiveModelFitterPlugin fitAddDom(Boolean value) {
        fitAddDom = new PluginParameter<>(fitAddDom, value);
        return this;
    }

    /**
     * The minimum number of individuals that are heterozygous
     * at a site for the dominance term to be included. If
     * the number of hets is less than minHets at a site,
     * an additive only model will be fit for that site.
     *
     * @return Minimum number of heterozygotes
     */
    public Integer minHets() {
        return minHets.value();
    }

    /**
     * Set Minimum number of heterozygotes. The minimum number
     * of individuals that are heterozygous at a site for
     * the dominance term to be included. If the number of
     * hets is less than minHets at a site, an additive only
     * model will be fit for that site.
     *
     * @param value Minimum number of heterozygotes
     *
     * @return this plugin
     */
    public StepwiseAdditiveModelFitterPlugin minHets(Integer value) {
        minHets = new PluginParameter<>(minHets, value);
        return this;
    }

    /**
     * Should the plugin impute a value for dominance if data
     * is missing. If false, the dominance score in the design
     * matrix will be 0 for missing genotypes.
     *
     * @return Impute Dominance Score
     */
    public Boolean imputedDominance() {
        return imputedDominance.value();
    }

    /**
     * Set Impute Dominance Score. Should the plugin impute
     * a value for dominance if data is missing. If false,
     * the dominance score in the design matrix will be 0
     * for missing genotypes.
     *
     * @param value Impute Dominance Score
     *
     * @return this plugin
     */
    public StepwiseAdditiveModelFitterPlugin imputedDominance(Boolean value) {
        imputedDominance = new PluginParameter<>(imputedDominance, value);
        return this;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy