public static OLSResult OLS(PieceConstIntensityResult res) { int index = 0; List <double> ts = res.Results.Select(x => (x.ConfInterval.Left + x.ConfInterval.Right) / 2).ToList(); List <ParamEstimation> parameters = new List <ParamEstimation>(); Func <double, List <ParamEstimation>, double> f = (t, ps) => ps[0].Value + ps[1].Value * t + ps[2].Value * t * t; double _t = ts.Average(); double _t2 = ts.Average(x => x * x); double _t3 = ts.Average(x => x * x * x); double _t4 = ts.Average(x => x * x * x * x); double _l = res.Results.Average(x => x.ConfInterval.Value); var qts = res.Results.Zip(ts, (x, t) => new { Index = t, Value = x.ConfInterval.Value }); double _lt = qts.Average(x => x.Index * x.Value); double _lt2 = qts.Average(x => x.Index * x.Index * x.Value); List <double> numParams = SlauSolver.Solve(new List <double[]> { new double[] { 1, _t, _t2 }, new double[] { _t, _t2, _t3 }, new double[] { _t2, _t3, _t4 } }, new List <double> { _l, _lt, _lt2 }); parameters.Add(new ParamEstimation("A", numParams[0])); parameters.Add(new ParamEstimation("B", numParams[1])); parameters.Add(new ParamEstimation("C", numParams[2])); return(new OLSResult(parameters, f)); }
public static ProbPieceConstIntensityResult ProbPieceIntensity(PieceConstIntensityResult res) { int i = 0, cls = 0; List <ProbPieceConstIntensityClassResult> newlst = new List <ProbPieceConstIntensityClassResult>(); while (i < res.Results.Count) { cls++; List <PieceConstIntensityClassResult> lst = new List <PieceConstIntensityClassResult>(); lst.Add(res.Results[i]); if (i + 1 == res.Results.Count) { newlst.Add(new ProbPieceConstIntensityClassResult(lst, cls, res.Results[i].ConfInterval.Value)); break; } int nextNs = res.Results[i].Number; double nextL = res.Results[i].ConfInterval.Value; do { int _ns = nextNs, ns = res.Results[i + 1].Number; double _l = nextL, l = res.Results[i + 1].ConfInterval.Value; double t = (l - _l) / Math.Sqrt((_ns - 1) * l * l + (ns - 1) * _l * _l) * Math.Sqrt((ns * _ns * (ns + _ns - 2)) / (ns + _ns)); Hypothesis h = Hypothesis.Student(t, ns + _ns - 2); if (h.IsAccepted) { nextNs += ns; nextL = (ns * l + _ns * _l) / (ns + _ns); lst.Add(res.Results[i + 1]); i++; } if (!h.IsAccepted || i + 1 == res.Results.Count) { lst.ForEach(x => x.ConfInterval.ChangeValue(nextL)); newlst.Add(new ProbPieceConstIntensityClassResult(lst, cls, nextL)); i++; break; } } while (true); } return(new ProbPieceConstIntensityResult(newlst)); }