使用caret包中的gam方法训练时出现错误:

7
我有一个在R中工作良好的gam模型,但是当我尝试使用caret包“训练”同样的模型时,它返回一个错误,说输入数据列是列表。有人理解这个问题吗?
我运行的代码如下:
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模型运行良好,但是训练返回以下错误信息:
    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    

感谢您的帮助!
1个回答

5
当您使用此模型的train时,目前无法指定gam公式。 caret有一个内部函数,根据每个预测变量有多少唯一级别等来确定公式。换句话说,train目前确定哪些术语被平滑处理,哪些是普通的线性主效应。
尝试在train公式中不包含平滑项的相同代码,并查看是否会导致错误。
下一个版本的caret(可能在年初左右)将为您提供更多灵活性,以创建自己的GAM和其他模型的公式。
Max

谢谢你的回复,Max!我也很想使用gam工具,比如vis.gam,因此非常感谢这份工作! - Statwonk
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - tchakravarty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接