【问题标题】:Running rms::Predict inside function throws various errors在函数内部运行 rms::Predict 会引发各种错误
【发布时间】:2019-12-17 17:39:39
【问题描述】:

我正在尝试在数据集的不同子集上运行多个逻辑回归模型,然后得出一些预测。但是,当我尝试自动化此过程时; rms 包一直给我带来问题。

模拟数据集:

library(rms)
library(tidyverse)

set.seed(123)

df <- tibble(country = sample(LETTERS[1:7], 100, replace = TRUE),
             y = rnorm(100),
             x = rnorm(100),
             category = sample(letters[1:4], 100, replace = TRUE),
             binary = sample(c(TRUE, FALSE), 100, replace = TRUE))

模仿我创建的产生错误的函数:

frm <- "category + x * binary"

frm_nocat <- "x * binary"

mod_filter <- quos(TRUE, category %in% c("a", "b"), category == "a", category == "b")

mod_form <- c(frm, frm, frm_nocat, frm_nocat)

run_rms <- function(dt, formula) {

  dt <- droplevels(dt)

  on.exit(options(datadist = NULL))

  fit <- lrm(as.formula(paste0("y ~", formula)),
             x=TRUE, y=TRUE,
             data= dt)

  rob <- robcov(fit, cluster=dt$country)

  dd <- datadist(dt)

  options(datadist = "dd")

  pred <- Predict(rob, fun = plogis)


  list(fit, rob, pred)


}


robust_mods <- map2(mod_filter, mod_form, ~run_rms(filter(df, !!.x), .y)) %>% transpose()
#> Error in Predict(x = rob, fun = plogis, name = "category"): object 'rob' not found

但是,如果我在全球环境中一步一步地这样做,它就会起作用。

filt_df <- filter(df, category %in% c("a", "b"))

fit <- lrm(y ~ category + x * binary,
           x=TRUE, y=TRUE,
           data= filt_df)

rob <- robcov(fit, cluster=filt_df$country)


dd <- datadist(filt_df)

options(datadist = "dd")

pred <- Predict(rob, fun = plogis)

plot(pred)

感谢大家的指点

【问题讨论】:

  • 你能展示如何为一个数据子集运行这个吗?
  • Ronak,感谢您的快速回复。我希望我现在说得更清楚了。

标签: r options glm


【解决方案1】:

也许你可以试试

library(rms)

run_rms <- function(filt_df, formula) {
    fit <- lrm(as.formula(paste0("y ~", formula)),
            x=TRUE, y=TRUE,data= filt_df)
    rob <- robcov(fit, cluster=filt_df$country)
    dd <- datadist(filt_df)
    options(datadist = "dd")
    Predict(rob, fun = plogis)
}

model_list <- purrr::map2(mod_filter, mod_form, ~run_rms(filter(df, !!.x), .y))

model_list 有预测结果。

purr::map(model_list, summary)
#[[1]]
# category       x            binary             yhat           lower           upper       .predictor.       
#a:  1     Min.   :-1.176   Mode :logical   Min.   :0.971   Min.   :0.751   Min.   :0.991   Length:204        
#b:203     1st Qu.:-0.375   FALSE:203       1st Qu.:0.977   1st Qu.:0.840   1st Qu.:0.997   Class :character  
#          Median : 0.363   TRUE :1         Median :0.980   Median :0.885   Median :0.997   Mode  :character  
#          Mean   : 0.383                   Mean   :0.979   Mean   :0.864   Mean   :0.997                     
#          3rd Qu.: 1.164                   3rd Qu.:0.982   3rd Qu.:0.896   3rd Qu.:0.997                     
#          Max.   : 1.965                   Max.   :0.986   Max.   :0.906   Max.   :0.999                     

#[[2]]
# category       x            binary             yhat           lower           upper       .predictor.       
# a:  1    Min.   :-1.176   Mode :logical   Min.   :0.971   Min.   :0.751   Min.   :0.991   Length:204        
# b:203    1st Qu.:-0.375   FALSE:203       1st Qu.:0.977   1st Qu.:0.840   1st Qu.:0.997   Class :character  
#          Median : 0.363   TRUE :1         Median :0.980   Median :0.885   Median :0.997   Mode  :character  
#          Mean   : 0.383                   Mean   :0.979   Mean   :0.864   Mean   :0.997                     
#          3rd Qu.: 1.164                   3rd Qu.:0.982   3rd Qu.:0.896   3rd Qu.:0.997                     
#          Max.   : 1.965                   Max.   :0.986   Max.   :0.906   Max.   :0.999                     

#[[3]]
# category       x            binary             yhat           lower           upper       .predictor.       
# a:  0    Min.   :-1.176   Mode :logical   Min.   :0.971   Min.   :0.751   Min.   :0.991   Length:202        
# b:202    1st Qu.:-0.383   FALSE:201       1st Qu.:0.977   1st Qu.:0.840   1st Qu.:0.997   Class :character  
#          Median : 0.379   TRUE :1         Median :0.980   Median :0.885   Median :0.997   Mode  :character  
#          Mean   : 0.389                   Mean   :0.979   Mean   :0.864   Mean   :0.997                     
#          3rd Qu.: 1.172                   3rd Qu.:0.982   3rd Qu.:0.896   3rd Qu.:0.997                     
#          Max.   : 1.965                   Max.   :0.984   Max.   :0.906   Max.   :0.998                     

#[[4]]
# category       x            binary             yhat           lower           upper       .predictor.       
# a:  0    Min.   :-1.176   Mode :logical   Min.   :0.971   Min.   :0.751   Min.   :0.991   Length:202        
# b:202    1st Qu.:-0.383   FALSE:201       1st Qu.:0.977   1st Qu.:0.840   1st Qu.:0.997   Class :character  
#          Median : 0.379   TRUE :1         Median :0.980   Median :0.885   Median :0.997   Mode  :character  
#          Mean   : 0.389                   Mean   :0.979   Mean   :0.864   Mean   :0.997                     
#          3rd Qu.: 1.172                   3rd Qu.:0.982   3rd Qu.:0.896   3rd Qu.:0.997                     
#          Max.   : 1.965                   Max.   :0.984   Max.   :0.906   Max.   :0.998          

【讨论】:

  • 嗨,Ronak,我仍然得到完全相同的错误“未找到对象'rob'”......看看你的代码,这并不奇怪;你只是简单地删除了最后的列表......你真的在你的电脑里得到了预测的结果吗?你能分享一下输出和任何相关的配置吗?
  • @FonsMA 是的,我得到了预测的结果。我为每个模型更新了summary 以上的结果。
  • 这真的很奇怪,不是吗?关于为什么删除列表会为您产生输出的任何理论?包含三个对象的输出是否也不适用于您?
  • 对我来说,如果我在 run_rms 函数的最后一行添加 list(fit, rob, pred) 就可以了。
猜你喜欢
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多