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

net.maizegenetics.stats.linearmodels.ModelEffects.kt Maven / Gradle / Ivy

package net.maizegenetics.stats.linearmodels

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

class NestedFactorModelEffect(val nestedEffect : FactorModelEffect, val outerEffect : FactorModelEffect, val id : Any) : ModelEffect {
    //so that the designMatrix is only calculated once
    var designMatrix : DoubleMatrix = DoubleMatrixFactory.DEFAULT.make(1,1,0.0);

    init {
        if (nestedEffect.size != outerEffect.size) throw IllegalArgumentException("nested and outer effects must have the same size (number of observations)")
    }

    override fun getID(): Any {
        return id
    }

    override fun setID(id: Any?) {
        throw NotImplementedError("setId is not implemented and must be set in the constructor.")
    }

    override fun getSize(): Int {
        return nestedEffect.getSize()
    }

    override fun getX(): DoubleMatrix {

        if (designMatrix.numberOfRows() == 1) {
            //do element-wise multiplication of columns of nestedEffect with columns of outerEffect
            val nestedDM = nestedEffect.x
            val outerDM = outerEffect.x
            val nrows = nestedDM.numberOfRows()
            val ncols = nestedDM.numberOfColumns() * outerDM.numberOfColumns();

            designMatrix = DoubleMatrixFactory.DEFAULT.make(nrows, ncols)

            var designCol = 0
            for (nestedCol in 0 until nestedDM.numberOfColumns()) {
                for (outerCol in 0 until outerDM.numberOfColumns()) {
                    for (row in 0 until nrows) {
                        designMatrix.set(row, designCol, nestedDM.get(row, nestedCol) * outerDM.get(row, outerCol))
                    }
                    designCol++
                }
            }

        }
        return designMatrix

    }

    override fun getXtX(): DoubleMatrix {
        return getX().crossproduct()
    }

    override fun getXty(y: DoubleArray?): DoubleMatrix {
        if ( y!= null) return getX().mult(DoubleMatrixFactory.DEFAULT.make(y.size, 1, y))
        else throw java.lang.IllegalArgumentException("null agrument to getXty not allowed")
    }

    override fun getyhat(beta: DoubleMatrix?): DoubleMatrix {
        throw NotImplementedError("getyhat not implemented for NestFactorModelEffects")
    }

    override fun getyhat(beta: DoubleArray?): DoubleMatrix {
        throw NotImplementedError("getyhat not implemented for NestFactorModelEffects")
    }

    override fun getLevelCounts(): IntArray {
        throw NotImplementedError("getyhat not implemented for NestFactorModelEffects")
    }

    override fun getNumberOfLevels(): Int {
        throw NotImplementedError("getLevelCounts not implemented for NestFactorModelEffects")
    }

    override fun getEffectSize(): Int {
        throw NotImplementedError("getEffectSize not implemented for NestFactorModelEffects")
    }

    override fun getCopy(): ModelEffect {
        throw NotImplementedError("getCopy not implemented for NestFactorModelEffects")
    }

    override fun getSubSample(sample: IntArray?): ModelEffect {
        throw NotImplementedError("getSubSample not implemented for NestFactorModelEffects")
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy