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

repicea.stats.model.dist.LogGaussianModel Maven / Gradle / Ivy

There is a newer version: 1.4.3
Show newest version
/*
 * This file is part of the repicea library.
 *
 * Copyright (C) 2009-2022 Mathieu Fortin for Rouge-Epicea
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This library is distributed with the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE. See the GNU Lesser General Public
 * License for more details.
 *
 * Please see the license at http://www.gnu.org/copyleft/lesser.html.
 */
package repicea.stats.model.dist;

import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.List;

import repicea.math.LogFunctionWrapper;
import repicea.math.Matrix;
import repicea.math.functions.LogGaussianFunction;
import repicea.stats.estimators.Estimator;
import repicea.stats.estimators.MaximumLikelihoodEstimator;
import repicea.stats.estimators.MaximumLikelihoodEstimator.MaximumLikelihoodCompatibleModel;
import repicea.stats.model.AbstractStatisticalModel;
import repicea.stats.model.CompositeLogLikelihood;
import repicea.stats.model.IndividualLogLikelihood;
import repicea.stats.model.SimpleCompositeLogLikelihood;

/**
 * The LogGaussianModel class makes it possible to fit a log-Gaussian distribution to a list of values.
*
* The fit relies on a maximum likelihood estimator. * * @author Mathieu Fortin - July 2022 */ public class LogGaussianModel extends AbstractStatisticalModel implements MaximumLikelihoodCompatibleModel { @SuppressWarnings("serial") private class LogGaussianLogLikehood extends LogFunctionWrapper implements IndividualLogLikelihood { private LogGaussianLogLikehood() { super(new LogGaussianFunction()); } @Override public void setYVector(Matrix yVector) { if (yVector.getNumberOfElements() != 1) { throw new InvalidParameterException("The yVector should be a unique element!"); } getOriginalFunction().setVariableValue(0, yVector.getValueAt(0, 0)); } @Override public Matrix getYVector() { return new Matrix(1, 1, getOriginalFunction().getVariableValue(0), 0d); } @Override public Matrix getPredictionVector() {return null;} } private final List values; private final SimpleCompositeLogLikelihood cLL; private final IndividualLogLikelihood individualLLK; /** * General constructor. * @param values a sample of the distribution * @param startingValues a 2x1 matrix with starting values. If set to null, the starting values are then 0 and 1 * for mu and sigma2, respectively. */ public LogGaussianModel(List values, Matrix startingValues) { super(); this.values = new ArrayList(); this.values.addAll(values); this.individualLLK = new LogGaussianLogLikehood(); cLL = new SimpleCompositeLogLikelihood(individualLLK, new Matrix(values)); setParameters(startingValues); try { setModelDefinition("pdf(y) = 1/(y*(2*PI*sigma2)^(1/2)) * e^(-(ln(y)-mu)^2 / (2 * sigma2))"); } catch (Exception e) {} } /** * Constructor based on default starting values.
*
* The mu and sigma2 parameters are set to 0 and 1, respectively. * @param values a sample of the distribution */ public LogGaussianModel(List values) { this(values, null); } @Override public void setParameters(Matrix beta) { if (beta == null) { Matrix betaDefault = new Matrix(2,1); betaDefault.setValueAt(1, 0, 1d); individualLLK.setParameters(betaDefault); } else { individualLLK.setParameters(beta); } } // @Override // public Matrix getParameters() { // return individualLLK.getParameters(); // } protected Estimator instantiateDefaultEstimator() {return new MaximumLikelihoodEstimator(this);} @Override public boolean isInterceptModel() {return false;} @Override public List getEffectList() { List effectList = new ArrayList(); effectList.add("mu parameter"); effectList.add("sigma2 parameter"); return effectList; } @Override public int getNumberOfObservations() {return values.size();} @Override public double getConvergenceCriterion() { return 1E-8; } @Override public CompositeLogLikelihood getCompleteLogLikelihood() {return cLL;} @Override public String toString() { return "Log-Gaussian model"; } @Override public List getOtherParameterNames() {return new ArrayList();} }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy