R forecast包Arima的lambda与biasadj参数的Python statsmodels等效实现查询
对应R forecast::Arima中lambda、biasadj参数的statsmodels实现方案
首先明确两个参数的功能对应逻辑:
lambda参数:对应R中对输入序列先做Box-Cox变换再拟合ARIMA的逻辑,statsmodels没有把这个参数封装到ARIMA类里,需要单独调用变换接口biasadj参数:对应Box-Cox逆变换时是否基于预测方差校正预测值的偏差,R中默认biasadj=TRUE
注意:Box-Cox变换要求输入序列所有值严格为正,若你的原始序列存在负值或零,需要先对序列做正向位移调整,再执行变换,逆变换后再减去对应位移值即可。
步骤1:Box-Cox变换(对应lambda参数)
使用scipy.stats.boxcox完成变换,支持手动指定lambda或自动搜索最优lambda:
from scipy.stats import boxcox from scipy.special import inv_boxcox import statsmodels.api as sm import numpy as np # 自动搜索最优lambda做变换 y_transformed, lambda_opt = boxcox(y_original) # 手动指定lambda(和R的lambda参数完全对齐) # lambda_fixed = 0 # 对应对数变换 # y_transformed = boxcox(y_original, lmbda=lambda_fixed) # lambda_opt = lambda_fixed
步骤2:用变换后的序列拟合ARIMA模型
和常规statsmodels ARIMA调用逻辑一致:
# 示例拟合ARIMA(1,1,1),可根据需求调整阶数 model = sm.tsa.ARIMA(y_transformed, order=(1,1,1)) res = model.fit()
步骤3:预测+逆变换(对应biasadj参数)
对应biasadj=FALSE的实现
直接对预测均值做逆变换即可:
# 预测未来10期 forecast_steps = 10 preds = res.get_forecast(steps=forecast_steps) pred_mean_transformed = preds.predicted_mean # 直接逆变换回原始尺度 pred_original = inv_boxcox(pred_mean_transformed, lambda_opt)
对应biasadj=TRUE的实现(R默认行为)
需要用预测方差做偏差校正,校正公式和R底层逻辑完全对齐:
pred_var = preds.var_pred_mean # Box-Cox逆变换偏差校正公式 adjusted_mean_transformed = pred_mean_transformed + 0.5 * pred_var * (1 - lambda_opt) pred_original_biasadj = inv_boxcox(adjusted_mean_transformed, lambda_opt)
封装示例(完全对齐R参数行为)
你可以把上述逻辑封装为工具函数,直接复用:
def arima_with_boxcox(y, order, lambda_param=None, biasadj=True): # lambda_param为None时自动搜索最优lambda,否则使用指定值 if lambda_param is None: y_trans, lam = boxcox(y) else: y_trans = boxcox(y, lmbda=lambda_param) lam = lambda_param # 拟合ARIMA模型 model = sm.tsa.ARIMA(y_trans, order=order) res = model.fit() # 封装预测方法,直接返回原始尺度的预测结果 def forecast(steps): pred = res.get_forecast(steps=steps) mean_trans = pred.predicted_mean if not biasadj: return inv_boxcox(mean_trans, lam) var_trans = pred.var_pred_mean adjusted_mean = mean_trans + 0.5 * var_trans * (1 - lam) return inv_boxcox(adjusted_mean, lam) return res, forecast, lam
内容的提问来源于stack exchange,提问作者Mangostino
相关产品推荐
相关产品推荐

