【问题标题】:error with train from caret package using method gam:使用方法 gam 从 caret 包中训练错误:
【发布时间】:2013-12-01 09:07:59
【问题描述】:

我有一个 gam 模型,我知道它在 R 中工作得很好,但是当我尝试使用 caret 包“train”相同的模型时,它返回一个错误,指出输入数据列是列表。有人明白吗?

我运行的代码如下:

library("caret")
library("mgcv")

a <- gam(RW ~ s(Temp0.grd) + s(mld.grd) + s(mean_depth.grd) +
           s(land_dist.grd) + s(slope.grd) + s(npp.grd),
         data=mydata,
         family=binomial)

all.data.gam.train <- 
  train(form=RW ~ s(Temp0.grd) + s(mld.grd) + s(mean_depth.grd) +
          s(land_dist.grd) + s(slope.grd) + s(npp.grd),
        data=mydata,
        method='gam',
        family=binomial
  )

第一个 gam 模型工作正常,但是 train 返回以下错误:

    Error in model.frame.default(form = RW ~ s(Temp0.grd) + s(mld.grd) + s(mean_depth.grd) +  : 
  invalid type (list) for variable 's(Temp0.grd)'

直接在公式上运行 model.frame.default 也会产生此错误,因此严格来说问题不在于 train。

mydata 如下所示:

> class(mydata)
[1] "data.frame"
> class(mydata$Temp0.grd)
[1] "numeric"
> class(s(mydata$Temp0.grd))
[1] "tp.smooth.spec"
> head(mydata)
    RW land_dist.grd mean_depth.grd  mld.grd   npp.grd primprod.grd Sal0.grd salbottom.grd
372  1           172      -79.83889 14.70062 1124.6136          920 31.27995         32.70
373  0           157      -84.53555 14.70062  973.1954          889 31.27995         32.70
374  1           146      -91.53111 14.70062  896.5736          803 31.38220         32.59
375  1           137      -89.44222 14.70062  783.4132          719 31.38220         32.59
405  1           173     -100.87666 14.70062 1010.4898          755 31.27995         32.70
406  1           197     -104.24111 14.70062  816.1457          767 31.27995         32.70
    salsurf.grd seamounts_dist.grd slope.grd sst.grd Temp0.grd Temp100.grd Temp50.grd
372       30.36           1529.184 16.068041    1.77  6.532125  0.31340000    0.36470
373       30.36           1513.419 16.317524    1.77  6.532125  0.31340000    0.36470
374       30.68           1496.227  8.578011    1.68  6.466700  0.01937502   -0.04645
375       30.68           1479.382  8.134535    1.68  6.466700  0.01937502   -0.04645
405       30.36           1483.972 18.345858    1.77  6.532125  0.31340000    0.36470
406       30.36           1474.469 13.433269    1.77  6.532125  0.31340000    0.36470
    tempbottom.grd
372           1.58
373           1.58
374           1.23
375           1.23
405           1.58
406           1.58

关于信息,我的 R 安装如下:

> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8       
 [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] mgcv_1.7-27     nlme_3.1-111    caret_5.16-04   reshape2_1.2.2  plyr_1.8       
[6] lattice_0.20-24 foreach_1.4.0   cluster_1.14.4 

loaded via a namespace (and not attached):
[1] codetools_0.2-8 grid_3.0.2      iterators_1.0.6 Matrix_1.1-0    stringr_0.6.2  
[6] tools_3.0.2    

感谢您的帮助!

【问题讨论】:

    标签: r r-caret gam


    【解决方案1】:

    当您将此模型使用train 时,您不能(此时)指定gam 公式。 caret 有一个内部函数,它根据每个预测变量的唯一级别等计算出一个公式。换句话说,train 当前确定哪些项是平滑的,哪些是普通的旧线性主效应。

    尝试使用train 公式中没有平滑项指示的相同代码,看看是否会导致错误。

    caret 的下一个版本(可能在年初左右)将让您更灵活地使用 GAM 和其他模型创建自己的公式。

    最大

    【讨论】:

    • 感谢您的回复,Max!我也很想使用gamvis.gam 这样的工具,所以工作将不胜感激!
    • 这方面有什么更新吗?由于我无法指定公式,所有变量都包含为平滑项,并且系数比数据多
    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2016-11-28
    • 1970-01-01
    • 2019-06-27
    • 2016-06-24
    • 2018-04-13
    相关资源
    最近更新 更多