计算一系列数据切片的线性回归

时间:2021-02-20 03:17:42

标签: php statistics linear-regression

我有一个非常简单的 CSV 格式的数据系列,第一列是月份的开始,第二列是值:

2007-01-01,4216
2007-02-01,4119
2007-03-01,3518

依此类推,直到 2021-01-01。从图表上可以清楚地看出,从某个点开始有下降趋势,但它会上下波动。我想看看 a) 那是什么 b) 坡度有多陡。我尝试了线性回归(它是 PHP 但没关系),用行号替换月份,但显然我完全忘记了它是如何工作的(tbf 统计考试是 25 多年前......)因为结果是完全是废话:

<?php

$fp = fopen('x.csv', 'r');
fgetcsv($fp);
$i = 1;
while ($row = fgetcsv($fp)) {
  $x[] = $i;
  $x2[] = $i * $i;
  $y[] = $row[1];
  $y2[] = $row[1] * $row[1];
  $xy[] = $i * $row[1];
  $i++;
}
$n = count($x);
$r = [];
for ($i = 0; $i < $n; $i++) {
  $xy_sum = array_sum(array_slice($xy, $i));
  $x_sum = array_sum(array_slice($x, $i));
  $y_sum = array_sum(array_slice($y, $i));
  $x2_sum = array_sum(array_slice($x2, $i));
  $y2_sum = array_sum(array_slice($y2, $i));
  $slope = ($n * $xy_sum - $x_sum * $y_sum) / ($n * $x2_sum - $x_sum * $x_sum );
  $r[strval($slope)] = (($n * $xy_sum - $x_sum * $y_sum) / sqrt(($n*$x2_sum - $x_sum * $x_sum) * ($n * $y2_sum - $y_sum * $y_sum)));
}
print_r($r);

r 不断增长,斜率从未变为负值,尽管它确实应该 - 2011-2016 年的数据从未低于 12000,有时高达 18000,此后很少达到 10000,也从未达到高于 11000,所以斜率肯定在某一时刻变成负值。

我做错了什么?

0 个答案:

没有答案