我有一些数据,我正在尝试教自己在回归模型中利用滞后预测器.我目前正在尝试从广义加法模型生成预测,该模型使用样条线来平滑数据并包含滞后.
假设我有以下数据并将数据拆分为训练和测试样本.
head(mtcars)
Train <- sample(1:nrow(mtcars), ceiling(nrow(mtcars)*3/4), replace=FALSE)
Run Code Online (Sandbox Code Playgroud)
太棒了,让我们在训练集上训练gam模型.
f_gam <- gam(hp ~ s(qsec, bs="cr") + s(lag(disp, 1), bs="cr"), data=mtcars[Train,])
summary(f_gam)
Run Code Online (Sandbox Code Playgroud)
当我对保留样本进行预测时,我收到一条错误消息.
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
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助诊断问题并帮助解决问题.我得到lag(__,1)的数据点为NA,这可能是长度不同的原因.但是,我没有解决问题的办法.
我要你用假设gam()从mgcv库.似乎gam()不喜欢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,])
Run Code Online (Sandbox Code Playgroud)
工作没有错误.
问题似乎来自该mgcv:::get.var功能.它厌倦了用类似的东西来解码术语
eval(parse(text = txt), data, enclos = NULL)
Run Code Online (Sandbox Code Playgroud)
并且因为它们明确地将机箱设置为NULL,所以无法解析基数之外的变量和函数名称.因为mean()在base包中,这是有效的
eval(parse(text="mean(x)"), data.frame(x=1:4), enclos=NULL)
# [1] 2.5
Run Code Online (Sandbox Code Playgroud)
但因为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"
Run Code Online (Sandbox Code Playgroud)
并且lag(),就像var()在stats包中定义的那样.