kpss function
Implementation
KPSSResult kpss(List<double> x, {int? nwLags}) {
final n = x.length;
if (n < 10) return KPSSResult(double.nan, 0);
final mu = mean(x);
final u = List<double>.generate(n, (i) => x[i] - mu);
final s = List<double>.filled(n, 0.0);
s[0] = u[0];
for (int t = 1; t < n; t++) s[t] = s[t - 1] + u[t];
final eta = s.map((v) => v * v).reduce((a, b) => a + b) / (n * n.toDouble());
final L = nwLags ?? (math.sqrt(n)).floor();
final gamma0 = autocov(u, 0)[0];
double lrv = gamma0;
for (int j = 1; j <= L; j++) {
final g = autocov(u, j)[j];
final w = 1.0 - j / (L + 1);
lrv += 2 * w * g;
}
final denom = lrv <= 0 ? 1e-12 : lrv;
final stat = eta / denom;
return KPSSResult(stat, L);
}