protected override double ComputeLLR(ModelScorer modelScorer, PhyloTree phyloTree, StringBuilder stringBuilder, double targetMarginal, double predictorMarginal, Converter <Leaf, SufficientStatistics> predictorDistributionClassFunction, Converter <Leaf, SufficientStatistics> targetDistributionClassFunction) { Converter <Leaf, SufficientStatistics> LeafToJointDistributionClass = CreateAlternativeSufficientStatisticsMap(predictorDistributionClassFunction, targetDistributionClassFunction); double logLikelihoodIndependentModel, logLikelihoodJointModel; Score scoreIndTarget, scoreIndPredictor, scoreJoint; MessageInitializer messageInitializer; // first score the target. NullModelDistribution.EmpiricalEquilibrium = targetMarginal; messageInitializer = modelScorer.CreateMessageInitializer(predictorDistributionClassFunction, targetDistributionClassFunction, NullModelDistribution); scoreIndTarget = modelScorer.ScoreModel(messageInitializer, false); NullModelDistribution.EmpiricalEquilibrium = predictorMarginal; messageInitializer = modelScorer.CreateMessageInitializer(targetDistributionClassFunction, predictorDistributionClassFunction, NullModelDistribution); scoreIndPredictor = modelScorer.ScoreModel(messageInitializer, false); DistributionDiscreteJointBinary jointDistn = (DistributionDiscreteJointBinary)AlternativeModelDistribution; jointDistn.SetInitialParams(scoreIndPredictor.OptimizationParameters, scoreIndTarget.OptimizationParameters); messageInitializer = modelScorer.CreateMessageInitializer(null, LeafToJointDistributionClass, jointDistn); scoreJoint = modelScorer.ScoreModel(messageInitializer, false); logLikelihoodIndependentModel = scoreIndTarget.Loglikelihood + scoreIndPredictor.Loglikelihood; logLikelihoodJointModel = scoreJoint.Loglikelihood; stringBuilder.Append(SpecialFunctions.CreateTabString(scoreIndPredictor.ToString(NullModelDistribution), scoreIndTarget.ToString(NullModelDistribution), logLikelihoodIndependentModel, scoreJoint.ToString(jointDistn), "")); double diff = logLikelihoodJointModel - logLikelihoodIndependentModel; return(diff); }
new public static ModelTesterDiscrete GetInstance(string modelTesterNameAndArguments) { if (modelTesterNameAndArguments.StartsWith(ModelTesterDiscreteFisher.Name)) { return(ModelTesterDiscreteFisher.GetInstance()); } else if (modelTesterNameAndArguments.StartsWith(ModelTesterDiscreteConditional.Name)) { string leafDistnName = modelTesterNameAndArguments.Substring(ModelTesterDiscreteConditional.Name.Length); DistributionDiscreteBinary distn = DistributionDiscreteBinary.GetInstance(leafDistnName); return(ModelTesterDiscreteConditional.GetInstance(distn)); } else if (modelTesterNameAndArguments.StartsWith(ModelTesterDiscreteJoint.Name)) { string altDistnName = modelTesterNameAndArguments.Substring(ModelTesterDiscreteJoint.Name.Length); DistributionDiscreteBinary nullDistn = DistributionDiscreteBinary.GetInstance("Repulsion"); // leafDistn doesn't matter DistributionDiscreteJointBinary altDistn = DistributionDiscreteJointBinary.GetInstance(altDistnName); return(ModelTesterDiscreteJoint.GetInstance(nullDistn, altDistn)); } else { throw new ArgumentException(String.Format("{0} does not start with a valid ModelTesterDiscrete name.", modelTesterNameAndArguments)); } }