`glmRob()`在使用`newdata`参数时无法进行预测。

3
以下是经过略微修改的代码,来自于glmRob()的示例。当使用newdata参数时,predict.glmRob() 函数出现了错误。我做错了什么吗?
suppressMessages(library(robust))
data(breslow.dat)
bres.rob <- glmRob(sumY ~ Age10 + Base4 * Trt, family = poisson(), data = breslow.dat)
predict(bres.rob, newdata = breslow.dat)

NextMethod("predict")中的错误:没有可调用的方法

devtools::session_info()
#> ─ Session info ─────────────────────────────────────────────────────────────
#>  setting  value                       
#>  version  R version 4.0.3 (2020-10-10)
#>  os       macOS Catalina 10.15.7      
#>  system   x86_64, darwin17.0          
#>  ui       X11                         
#>  language (EN)                        
#>  collate  en_US.UTF-8                 
#>  ctype    en_US.UTF-8                 
#>  tz       America/Los_Angeles         
#>  date     2020-12-14                  
#> 
#> ─ Packages ─────────────────────────────────────────────────────────────────
#>  package     * version date       lib source        
#>  assertthat    0.2.1   2019-03-21 [1] CRAN (R 4.0.0)
#>  callr         3.5.1   2020-10-13 [1] CRAN (R 4.0.2)
#>  cli           2.2.0   2020-11-20 [1] CRAN (R 4.0.3)
#>  crayon        1.3.4   2017-09-16 [1] CRAN (R 4.0.0)
#>  DEoptimR      1.0-8   2016-11-19 [1] CRAN (R 4.0.0)
#>  desc          1.2.0   2018-05-01 [1] CRAN (R 4.0.0)
#>  devtools      2.3.2   2020-09-18 [1] CRAN (R 4.0.2)
#>  digest        0.6.27  2020-10-24 [1] CRAN (R 4.0.2)
#>  ellipsis      0.3.1   2020-05-15 [1] CRAN (R 4.0.0)
#>  evaluate      0.14    2019-05-28 [1] CRAN (R 4.0.0)
#>  fansi         0.4.1   2020-01-08 [1] CRAN (R 4.0.0)
#>  fit.models  * 0.64    2020-08-02 [1] CRAN (R 4.0.2)
#>  fs            1.5.0   2020-07-31 [1] CRAN (R 4.0.2)
#>  glue          1.4.2   2020-08-27 [1] CRAN (R 4.0.2)
#>  highr         0.8     2019-03-20 [1] CRAN (R 4.0.0)
#>  htmltools     0.5.0   2020-06-16 [1] CRAN (R 4.0.0)
#>  knitr         1.30    2020-09-22 [1] CRAN (R 4.0.2)
#>  lattice       0.20-41 2020-04-02 [1] CRAN (R 4.0.3)
#>  magrittr      2.0.1   2020-11-17 [1] CRAN (R 4.0.2)
#>  MASS          7.3-53  2020-09-09 [1] CRAN (R 4.0.3)
#>  memoise       1.1.0   2017-04-21 [1] CRAN (R 4.0.0)
#>  mvtnorm       1.1-1   2020-06-09 [1] CRAN (R 4.0.0)
#>  pcaPP         1.9-73  2018-01-14 [1] CRAN (R 4.0.0)
#>  pkgbuild      1.1.0   2020-07-13 [1] CRAN (R 4.0.0)
#>  pkgload       1.1.0   2020-05-29 [1] CRAN (R 4.0.0)
#>  prettyunits   1.1.1   2020-01-24 [1] CRAN (R 4.0.0)
#>  processx      3.4.5   2020-11-30 [1] CRAN (R 4.0.2)
#>  ps            1.5.0   2020-12-05 [1] CRAN (R 4.0.2)
#>  R6            2.5.0   2020-10-28 [1] CRAN (R 4.0.2)
#>  remotes       2.2.0   2020-07-21 [1] CRAN (R 4.0.2)
#>  rlang         0.4.9   2020-11-26 [1] CRAN (R 4.0.2)
#>  rmarkdown     2.5     2020-10-21 [1] CRAN (R 4.0.2)
#>  robust      * 0.5-0.0 2020-03-08 [1] CRAN (R 4.0.0)
#>  robustbase    0.93-6  2020-03-23 [1] CRAN (R 4.0.0)
#>  rprojroot     2.0.2   2020-11-15 [1] CRAN (R 4.0.2)
#>  rrcov         1.5-5   2020-08-03 [1] CRAN (R 4.0.2)
#>  sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 4.0.0)
#>  stringi       1.5.3   2020-09-09 [1] CRAN (R 4.0.2)
#>  stringr       1.4.0   2019-02-10 [1] CRAN (R 4.0.0)
#>  testthat      3.0.0   2020-10-31 [1] CRAN (R 4.0.2)
#>  usethis       1.6.3   2020-09-17 [1] CRAN (R 4.0.2)
#>  withr         2.3.0   2020-09-22 [1] CRAN (R 4.0.2)
#>  xfun          0.19    2020-10-30 [1] CRAN (R 4.0.2)
#>  yaml          2.2.1   2020-02-01 [1] CRAN (R 4.0.0)
#> 
#> [1] /Library/Frameworks/R.framework/Versions/4.0/Resources/library

此处内容由reprex包(v0.3.0)于2020-12-14创建。

需要注意的是,常规的glm()也可以正常工作。

suppressMessages(library(robust))
data(breslow.dat)
bres.glm <- glm(sumY ~ Age10 + Base4 * Trt, family = poisson(), data = breslow.dat)
predict(bres.glm, newdata = breslow.dat)
#>        1        2        3        4        5        6        7        8 
#> 2.957756 2.933407 2.704879 3.015431 3.913226 3.250763 2.979112 4.101214 
#>        9       10       11       12       13       14       15       16 
#> 3.360129 2.863352 3.955120 3.257157 2.912460 3.741554 4.459110 3.668917 
#>       17       18       19       20       21       22       23       24 
#> 3.034205 5.093412 3.131601 2.906475 2.930414 2.671553 3.110244 3.174723 
#>       25       26       27       28       29       30       31       32 
#> 3.873096 3.134184 2.644211 3.507451 3.917288 3.375050 2.641300 2.675629 
#>       33       34       35       36       37       38       39       40 
#> 2.592602 2.854897 3.163672 2.890335 2.625822 3.756825 3.201280 2.557211 
#>       41       42       43       44       45       46       47       48 
#> 2.784067 2.988840 3.585320 3.060731 3.448097 2.484164 3.182476 2.577124 
#>       49       50       51       52       53       54       55       56 
#> 5.757692 3.003209 3.274328 3.308657 3.525533 3.268830 2.863768 2.857114 
#>       57       58       59 
#> 2.805090 2.891444 2.892553

此示例由reprex软件包(版本为0.3.0)于2020年12月14日创建。

1个回答

2

由于您正在运行相同的数据,只需删除newdata参数。

从强大的文档此处

newdata - 可选,一个数据帧,在其中查找要预测的变量。如果省略,则使用拟合的线性预测器。

编辑以添加

列出的作者之一回复并建议使用软件包“robustbase”(他是维护者),而不是“robust”,因为前者中使用的方法更现代,并且得到了更广泛的测试和示例支持。

这是我用于快速比较两者的示例代码。请注意,robustbase的glmrob中的'r'是小写。

library(robustbase)
library(robust)
data(breslow.dat)

## Comparison of methods.

bres.robustbase <- glmrob(sumY ~ Age10 + Base4 * Trt, family = poisson, data = breslow.dat)
predict(bres.robustbase, newdata = breslow.dat)

bres.robust <- glmRob(sumY ~ Age10 + Base4 * Trt, family = poisson(), data = breslow.dat)
predict(bres.robust)

## predict handling test data on robustbase's glmrob object.

lastIndex = round(nrow(breslow.dat)*0.7)
train = breslow.dat[1:lastIndex,]
test = breslow.dat[(lastIndex + 1):nrow(breslow.dat),]

bres.robustbase <- glmrob(sumY ~ Age10 + Base4 * Trt, family = poisson, data = train)
predict(bres.robustbase, newdata = test)

请注意,glmrobglmRob之间的系数估计和预测将有所不同。决定哪个更准确超出了我的知识范围(希望您不是),但我已经跟进我们的作者,看看他是否能够给出一个高层次的解释,可以在这里发布。


1
这很有趣,但可能实际上并不能解决原帖作者的问题。(我花了一些时间在S3方法分派等方面挖掘,但并没有取得太大进展……) - Ben Bolker
1
是的,看起来 NextMethod 没有正确传递,也许 family(object)$inverse 应该是 family(object)$linkinv。我认为应该向 maintainer("robust") 提出一个 bug。 - user20650
1
所以只是想澄清一下。我通常想使用newdata参数来预测新鲜数据。在这里,我只是将拟合数据传递到newdata中,以表明该模型甚至无法对自己的数据进行预测(澄清任何问题都与我传递的数据格式无关)。 - Rory Nolan
1
@Econundrums;感谢您的跟进。关于系数,在我的电脑上,glmRob下的系数不稳定,即在不同的运行中会发生剧烈变化,因此可能会得到一些不准确的预测结果。 - user20650
1
@user20650 我想这更加理由使用robustbase了 ;) - Econundrums
显示剩余2条评论

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