kpss function

KPSSResult kpss(
  1. List<double> x, {
  2. int? nwLags,
})

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);
}