首页 > 解决方案 > 在函数内部运行 rms::Predict 会引发各种错误

问题描述

我正在尝试在数据集的不同子集上运行多个逻辑回归模型,然后得出一些预测。但是,当我尝试自动化此过程时;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)

感谢您的任何指点

标签: roptionsglm

解决方案


也许你可以试试

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          

推荐阅读