r - 在函数内部运行 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)
感谢您的任何指点
解决方案
也许你可以试试
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
推荐阅读
- javascript - 无法对从 innerText 提取的日期数组进行排序
- python - 如何在 AWS Lambda 中最好地使用 Python 3 的 mimetypes 模块?
- python - 使用 PyMongo 的 MongoDB Atlas 的 ServerTimeoutError(运行设置代码)
- c - 欧拉计划 - 问题 22:答案降低 3.35%
- c# - 如果给定函数参数而不是文字,实体框架和 Oracle,Linq where 子句字符串比较不返回任何记录
- java - Lombok 和 builder 注释
- javascript - 将动画添加到下拉菜单
- excel - 如何修复“运行时错误 1004,对象“_Application”的方法“宽度”失败”
- javascript - 显示完全错误图标的材料设计图标
- amazon-web-services - 使用 AWS-SDK 访问 AWS SSO