R:回归系数和润滑

机器算法验证 r 时间序列 回归系数
2022-03-16 17:21:01

当我应用到使用lm处理和四舍五入的日期时,我得到了一些奇怪的系数。lubridateMWE:

library(ggplot2)
library(lubridate)
library(dplyr)

lakers$month <- ymd(lakers$date) %>% round_date(unit = 'month')
items_by_month <- lakers %>% group_by(month) %>% summarize(count = n()) %>%
    mutate(count = count / 1000)

ggplot(data = items_by_month, aes(x = month, y = count)) + 
    geom_line() +
    stat_smooth(method = 'lm', data = items_by_month)

model <- lm(data = items_by_month, count ~ month)
summary(model)
time <- max(items_by_month$month) - min(items_by_month$month)
coef(model)['month'] * as.numeric(time)

该图表明ggplot,至少,了解回归模型的情况。
绘制每月总计和回归线

但是在summary(model)系数上month是 10^-7 的数量级,这太小了大约 5 个数量级:图中显示第一个日期和最后一个日期之间增加了大约 2.5,但最后一行显示增加了大约 2.5 * 10^-5。

请注意,我已将count列除以 10^3,以便获得更易于阅读的值(并且更接近我的实际用例)。但这不应该影响情节或lm另外,我知道有比线性回归更复杂的技术来分析时间序列数据;但我只是关注一段时间内的总体趋势,而不是考虑季节性模式等。

1个回答

可能的解决方案

如果您要在问题中报告特定数量,这会有所帮助,但即便如此,人们也可以做出合理的猜测。我的眼睛说拟合线的斜率在2每 5 个月,或5每年。如果您的输出是“按顺序”107,这意味着它在附近5/107是您预期的倍数。这接近每年的秒数(等于107π一个很好的近似值),这表明您的“月”变量的内部数值是以而不是年为单位的。 因此,您需要做的就是将其从每秒的变化率转换回每年的变化率。转换系数约为

60 seconds/minute×60 minutes/hour×24 hours/day×365.2422 days/year=3.1556926×107 seconds/year.

一般建议和评论

我提供了这个答案,而不是将问题迁移到 StackOverflow,因为此类日期问题很常见:​​它们发生在几乎每个计算平台上,从 Excel 到R. 大量平台的经验建议遵循一些简单的原则:

  1. 使用系统的内部日期数据类型来存储日期、执行特定日期的操作(例如查找星期几等),并在图形上生成良好的标签。

  2. 对于统计分析,通过计算日期的数字等价物来规避系统的默认设置。通常最好建立一个项目特定的日期原点,并用该特定原点的天、月或年表示所有日期。这实现了几个重要的事情:

    • 您不会在表示日期的单位方面犯错误。
    • 您的统计输出,例如回归系数,将很容易解释。
    • 您的计算往往在数值上更稳定,因为它们将涉及合理大小的数字。(R的内部日期值,自 1969 年底以来以秒为单位,有数十亿:即使在双精度计算中,许多统计过程中涉及的平方和都会导致灾难性的精度损失。请参阅https:// stats.stackexchange.com/a/318516/919进行讨论。)
  3. 当使用“理解”如何处理不同长度的月份、年度、每月和每周季节如何工作等的时间序列程序时,允许规则 (2) 例外。