public override double LogLikelihood(Vector <double> parameter, double penaltyFactor, bool fillOutputs) { //var sigmaSquared = new Vector(values.Count); //double mVar = GetVariance(parameter); //var allLLs = new Vector(values.Count); //for (int t = 0; t < values.Count; ++t ) // allLLs[t] = conditionalLL(t, sigmaSquared, parameter, mVar); Vector <double> pbak = Parameters; if (values == null) { return(double.NaN); } if (parameter != null) { Parameters = parameter; } var sigmaSquared = Vector <double> .Build.Dense(values.Count); double mVar = GetVariance(Parameters); double logLikelihood = 0; var allLLs = Vector <double> .Build.Dense(values.Count); for (int t = 0; t < values.Count; ++t) { allLLs[t] = conditionalLL(t, sigmaSquared, Parameters, mVar); logLikelihood += allLLs[t]; } if (fillOutputs) { var rts = new TimeSeries { Title = values.Title + "[GARCH Res]" }; predictiveStdDevAtAvail = new TimeSeries { Title = values.Title + "Pred.StDev[AA]" }; for (int t = 0; t < values.Count; ++t) { double rx = values[t] / Math.Sqrt(sigmaSquared[t]); rts.Add(values.TimeStamp(t), rx, false); if (t > 0) { predictiveStdDevAtAvail.Add(values.TimeStamp(t - 1), Math.Sqrt(sigmaSquared[t]), false); } } Residuals = rts; GoodnessOfFit = logLikelihood; } if (parameter != null) { Parameters = pbak; } var llp = new LogLikelihoodPenalizer(allLLs); return(llp.LogLikelihood - llp.Penalty * penaltyFactor); }
public override double LogLikelihood(Vector <double> parameter, double penaltyFactor, bool fillOutputs) { Vector <double> allLLs = null; Vector <double> pbak = Parameters; // save the current one if (values == null) { return(double.NaN); } if (values.Count == 0) { return(double.NaN); } if (parameter != null) { Parameters = parameter; } Residuals = null; double loglikelihood = 0; if (!DataIsLongitudinal()) { double[] rs; double[] forecs; double[] resids = ComputeSpecialResiduals(values, out rs, 1, out forecs); TimeSeries rts; TimeSeries unstdrts; if (fillOutputs) { rts = new TimeSeries { Title = values.Title + "[ARMA Res]" }; unstdrts = new TimeSeries { Title = values.Title + "[ARMA Res]" }; oneStepPredictors = new TimeSeries { Title = values.Title + "[Predic]" }; oneStepPredStd = new TimeSeries { Title = values.Title + "[Pred. Stdev.]" }; oneStepPredictorsAtAvailability = new TimeSeries { Title = values.Title + "[Predic. AA]" }; for (int t = 0; t < values.Count; ++t) { rts.Add(values.TimeStamp(t), resids[t] / Sigma, false); unstdrts.Add(values.TimeStamp(t), resids[t], false); double stdev = Math.Sqrt(rs[t]); double fx = values[t] - resids[t] * stdev; oneStepPredictors.Add(values.TimeStamp(t), fx, false); oneStepPredStd.Add(values.TimeStamp(t), stdev * Sigma, false); fx = t < values.Count - 1 ? values[t + 1] - resids[t + 1] * Math.Sqrt(rs[t + 1]) : forecs[0]; oneStepPredictorsAtAvailability.Add(values.TimeStamp(t), fx, false); } Residuals = rts; unstandardizedResiduals = unstdrts; } // now it is easy to compute the likelihood // this is a straightforward implementation of eqn (8.7.4) in Brockwell & Davis, // Time Series: Theory and Methods (2nd edition) allLLs = GetLikelihoodsFromResiduals(resids, rs); for (int t = 0; t < values.Count; ++t) { loglikelihood += allLLs[t]; } } else { // do nothing for now! return(double.NaN); } if (fillOutputs) { GoodnessOfFit = loglikelihood; } if (parameter != null) { Parameters = pbak; // then restore original } var llp = new LogLikelihoodPenalizer(allLLs); return(llp.LogLikelihood - llp.Penalty * penaltyFactor); }