带对数变换时间建模中fable::TSLM()预测值为何略低于stats::lm()?
两类模型预测结果差异的核心原因
拟合阶段的微小差异属于正常计算误差
- 你观察到拟合值阶段两类输出的平均差仅为3.79e-14,属于纯浮点运算误差,不存在本质逻辑差异。
TSLM()中使用的trend()参数,基于tsibble内置的时间索引生成连续时间刻度(从训练集第一个观测点开始按时间步长计数,通常从0开始),但线性回归的截距项会自动吸收这类常数偏移,和你手动构建从1开始计数的Month_Number变量拟合的stats::lm()模型在数学上完全等价,不存在函数误用或包缺陷问题。
预测阶段的显著差异来自变换后的预测校正逻辑
- 你拟合的是带对数变换的线性模型
log(Value) ~ trend(),模型在对数空间输出的预测值是log(Value)的条件均值μ。如果直接对μ取指数exp(μ),得到的是原尺度下Value的条件中位数,并非无偏的条件均值。 - 根据对数正态分布的统计性质,原尺度下
Value的无偏条件均值为exp(μ + σ²/2),其中σ是模型残差的标准差。fable在计算mean作为点预测指标时,会自动应用这个校正公式,输出符合统计定义的原尺度均值预测值;而你使用lm()拟合后直接对预测值取指数,输出的是未做方差补偿的中位数预测,两者自然会产生系统性偏差。
对齐两类输出的操作方法
- 如果需要和之前用
lm()计算的未校正结果完全对齐,只需要在生成预测时将点预测指标从均值改为中位数即可,对应修改后的预测代码:
修改后两类预测值的差异会回到和拟合阶段同量级的浮点误差水平,不会再出现显著偏差。future_values <- fable_model %>% forecast(h = 12, point_forecast = list(Fable_Model = median)) %>% mutate(Type = "Forecast") %>% as_tsibble() %>% select(-Value) - 如果你需要的是原尺度下的无偏均值预测,fable默认的输出才是统计上更准确的结果,之前直接对对数预测值取指数的操作会忽略对数变换带来的方差补偿,存在系统性偏差。
内容的提问来源于stack exchange,提问作者wurli
相关产品推荐
相关产品推荐

