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

net.maizegenetics.stats.linearmodels.NestedCovariateModelEffect Maven / Gradle / Ivy

package net.maizegenetics.stats.linearmodels;

import java.util.Arrays;

import net.maizegenetics.matrixalgebra.Matrix.DoubleMatrix;
import net.maizegenetics.matrixalgebra.Matrix.DoubleMatrixFactory;

public class NestedCovariateModelEffect implements ModelEffect {
    private Object id;
    private final int size;
    private final double[] covariate;
    private final FactorModelEffect fme;

    public NestedCovariateModelEffect(CovariateModelEffect cme, FactorModelEffect fme) {
        covariate = cme.getCovariate();
        size = covariate.length;
        this.fme = fme;
    }

    public NestedCovariateModelEffect(double[] covariate, FactorModelEffect fme) {
        this.covariate = covariate;
        size = covariate.length;
        this.fme = fme;
    }

    public NestedCovariateModelEffect(float[] covariate, FactorModelEffect fme) {
        int n = covariate.length;
        double[] cov = new double[n];
        for (int i = 0; i < n; i++)
            cov[i] = covariate[i];
        this.covariate = cov;
        size = covariate.length;
        this.fme = fme;
    }

    private NestedCovariateModelEffect(Object id, int size, double[] covariate,
            FactorModelEffect fme) {
        this.id = id;
        this.covariate = Arrays.copyOf(covariate, covariate.length);
        this.size = size;
        this.fme = (FactorModelEffect) fme.getCopy();
    }

    public static NestedCovariateModelEffect getInstance(CovariateModelEffect cme, ModelEffect me) {
        if (me instanceof FactorModelEffect) {
            return new NestedCovariateModelEffect(cme, (FactorModelEffect) me);
        } else {
            return null;
        }
    }

    public static NestedCovariateModelEffect getInstance(double[] covariate, ModelEffect me) {
        if (me instanceof FactorModelEffect) {
            return new NestedCovariateModelEffect(covariate, (FactorModelEffect) me);
        } else {
            return null;
        }
    }

    @Override
    public Object getID() {
        return id;
    }

    @Override
    public int[] getLevelCounts() {
        return fme.getLevelCounts();
    }

    @Override
    public int getNumberOfLevels() {
        return fme.getNumberOfLevels();
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public DoubleMatrix getX() {
        int nlevels = fme.getNumberOfLevels();
        int[] levels = fme.getLevels();
        DoubleMatrix x = DoubleMatrixFactory.DEFAULT.make(size, nlevels);
        for (int i = 0; i < size; i++)
            x.set(i, levels[i], covariate[i]);
        return x;
    }

    @Override
    public DoubleMatrix getXtX() {
        int nlevels = fme.getNumberOfLevels();
        int[] levels = fme.getLevels();
        DoubleMatrix xtx = DoubleMatrixFactory.DEFAULT.make(nlevels, nlevels, 0);
        for (int i = 0; i < size; i++)
            xtx.set(levels[i], levels[i], xtx.get(levels[i], levels[i]) + covariate[i]
                    * covariate[i]);
        return xtx;
    }

    @Override
    public DoubleMatrix getXty(double[] y) {
        int nlevels = fme.getNumberOfLevels();
        int[] levels = fme.getLevels();
        DoubleMatrix xty = DoubleMatrixFactory.DEFAULT.make(nlevels, 1, 0);
        for (int i = 0; i < size; i++)
            xty.set(levels[i], 0, xty.get(levels[i], 0) + covariate[i] * y[i]);
        return xty;
    }

    @Override
    public DoubleMatrix getyhat(DoubleMatrix beta) {
        int[] levels = fme.getLevels();
        DoubleMatrix yhat = DoubleMatrixFactory.DEFAULT.make(size, 1);
        for (int i = 0; i < size; i++) {
            yhat.set(i, 0, beta.get(levels[i], 0));
        }
        return yhat;
    }

    @Override
    public DoubleMatrix getyhat(double[] beta) {
        int[] levels = fme.getLevels();
        DoubleMatrix yhat = DoubleMatrixFactory.DEFAULT.make(size, 1);
        for (int i = 0; i < size; i++) {
            yhat.set(i, 0, beta[levels[i]]);
        }
        return yhat;
    }

    @Override
    public void setID(Object id) {
        this.id = id;
    }

    public DoubleMatrix getXtX2(NestedCovariateModelEffect ncme) {
        FactorModelEffect fme2 = ncme.getFactorModelEffect();
        int nrows = fme.getNumberOfLevels();
        int ncols = fme2.getNumberOfLevels();
        int[] levels = fme.getLevels();
        int[] levels2 = fme2.getLevels();
        DoubleMatrix xtx2 = DoubleMatrixFactory.DEFAULT.make(nrows, ncols, 0);
        for (int i = 0; i < size; i++) {
            xtx2.set(levels[i], levels2[i], xtx2.get(levels[i], levels2[i]) + covariate[i]
                    * ncme.covariate[i]);
        }
        return xtx2;
    }

    public FactorModelEffect getFactorModelEffect() {
        return fme;
    }

    @Override
    public ModelEffect getCopy() {
        return new NestedCovariateModelEffect(id, size, covariate, fme);
    }

    @Override
    public ModelEffect getSubSample(int[] sample) {
        int numberOfSamples = sample.length;
        double[] sampleCov = new double[numberOfSamples];
        for (int i = 0; i < numberOfSamples; i++)
            sampleCov[i] = covariate[sample[i]];
        return new NestedCovariateModelEffect(sampleCov, (FactorModelEffect) fme.getSubSample(sample));
    }

    @Override
    public int getEffectSize() {
        return getNumberOfLevels();
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy