使用样条和滞后预测变量从GAM模型中提取预测

时间:2014-12-17 02:27:34

标签: r

我有一些数据,并且我正在尝试自我介绍在回归模型中利用滞后预测变量。我目前正在尝试使用通用加法模型生成预测,该模型使用样条线来平滑数据并包含滞后。

假设我有以下数据并将数据拆分为训练和测试样本。

head(mtcars)
Train <- sample(1:nrow(mtcars), ceiling(nrow(mtcars)*3/4), replace=FALSE)

太棒了,让我们在训练集上训练gam模型。

f_gam <- gam(hp ~ s(qsec, bs="cr") + s(lag(disp, 1), bs="cr"), data=mtcars[Train,])

summary(f_gam)

当我对保留样本进行预测时,我收到一条错误消息。

f_gam.pred <- predict(f_gam, mtcars[-Train,]); f_gam.pred

Error in ExtractData(object, data, NULL) : 
  'names' attribute [1] must be the same length as the vector [0]
Calls: predict ... predict.gam -> PredictMat -> Predict.matrix3 -> ExtractData

任何人都可以帮助诊断问题并帮助解决问题。我得到lag(__,1)将数据点保留为NA,这可能是长度不同的原因。但是,我没有解决问题的方法。

1 个答案:

答案 0 :(得分:7)

我假设您正在使用gam()库中的mgcvgam()似乎不喜欢s()术语中未在“base”中定义的函数。您可以通过添加包含转换变量的列然后使用该变量进行建模来解决此问题。例如

tmtcars <- transform(mtcars, ldisp=lag(disp,1))
Train <- sample(1:nrow(mtcars), ceiling(nrow(mtcars)*3/4), replace=FALSE)
f_gam <- gam(hp ~ s(qsec, bs="cr") + s(ldisp, bs="cr"), data= tmtcars[Train,])
summary(f_gam)
predict(f_gam, tmtcars[-Train,])

无错误地工作。

问题似乎来自mgcv:::get.var功能。它厌倦了用

之类的东西来解码术语
eval(parse(text = txt), data, enclos = NULL)

并且因为它们明确地将机箱设置为NULL,所以无法解析基数之外的变量和函数名称。因为mean()位于base包中,因此

eval(parse(text="mean(x)"), data.frame(x=1:4), enclos=NULL)
# [1] 2.5

但由于var()中定义了stats,因此

eval(parse(text="var(x)"), data.frame(x=1:4), enclos=NULL)
# Error in eval(expr, envir, enclos) : could not find function "var"

lag()一样,var()stats包中定义。