【问题标题】:Extracting predictions from a GAM model with splines and lagged predictors从具有样条和滞后预测变量的 GAM 模型中提取预测
【发布时间】:2015-02-15 12:27:45
【问题描述】:

我有一些数据,正在尝试自学如何在回归模型中使用滞后预测变量。我目前正在尝试从使用样条曲线平滑数据并包含滞后的广义加法模型生成预测。

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

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,这可能是长度不同的原因。但是,我没有解决问题的方法。

【问题讨论】:

    标签: r


    【解决方案1】:

    我假设您使用的是来自mgcv 库的gam()。看来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,])
    

    正常工作。

    问题似乎来自mgcv:::get.var 函数。它厌倦了用类似的东西来解码这些术语

    eval(parse(text = txt), data, enclos = NULL)
    

    并且因为他们明确地将附件设置为 NULL,所以无法解析 base 之外的变量和函数名称。所以因为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 包中定义的。

    【讨论】:

    • 很好地解释了为什么某些东西不起作用或引发错误。这有助于我们,未启动。谢谢@MrFlick!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2020-08-19
    • 2017-01-04
    • 2015-10-31
    • 2020-09-08
    • 2021-09-25
    相关资源
    最近更新 更多