【发布时间】:2021-05-14 20:37:26
【问题描述】:
我正在尝试使用 pROC 包中的 ci.auc() 函数创建一个函数来提取“曲线下面积”估计值的 2 个命名变量的置信区间,但它会产生错误:
Error in model.frame.default(formula = anchor, data = namedvar1, : 'data' must be a data.frame, environment, or list 。
如何解决这个问题?有没有更好的方法来指定从哪个数据帧中绘制命名变量?
原始代码运行良好:
library(pROC)
df <- structure(list(anchor1 = c(1, 0, 1, 0, 1, 0), namedvar1 = c(0.603,
-0.006, 0, 0.263, 0, -0.089), namedvar2 = c(0.150346263678009,
0.388250731888, -0.2579633906095, 0.2562039253, 0.139948502022,
-0.267652844)), row.names = c(6L, 7L, 12L, 13L, 19L, 29L), class = "data.frame")
# Base example with to extract CI bounds & estimate
as.numeric (ci.auc ( roc (df$anchor1, df$namedvar1, smooth = FALSE,
direction = "<" ,ci = TRUE, boot.stratified = TRUE ) ) )
# Output looks good:
[1] 0.2908208 0.7777778 1.0000000
太好了,所以我将上述内容集成到我的函数中(我想为多个命名变量执行此操作):
### CREATE FUNC TO CALCULATE AUC and 95% CIs
new_roc <- function( df, anchor, na.rm = T) {
anchor <- enquo(anchor)
# Calculate and save this information as an object
dplyr::summarise(df,
# ci.auc() & roc() are from pROC package
"Var1 AUC CIs" = as.numeric (ci.auc (roc (anchor, namedvar1, smooth = FALSE,
direction = "<" ,ci = TRUE, boot.stratified = TRUE ) ) ),
"Var2 AUC CIs" = as.numeric (ci.auc (roc (anchor, namedvar2, smooth = FALSE,
direction = "<" ,ci = TRUE, boot.stratified = TRUE ) ) )
)
}
但是当我测试它时,我得到一个错误!
# Try the function
new_roc(df, anchor1 )
# Error output:
`Error in model.frame.default(formula = anchor, data = namedvar1, :'data' must be a data.frame, environment, or list`
我试过class(df),确实是data.frame,所以不确定是什么问题。
为了尝试隔离问题,我尝试了内部代码,但首先指定了数据框 - 不起作用:
# Doesn't work to pipe the df
df %>%
as.numeric (ci.auc (roc (anchor1, namedvar1, smooth = FALSE,
direction = "<" ,ci = TRUE, boot.stratified = TRUE ) ) )
## Produces error
Error in roc(anchor1, namedvar1, smooth = FALSE, direction = "<", :
object 'anchor1' not found
也许我不必要地使用 dplyr?是否有不同的方法来指定从哪个数据框绘制命名变量?谢谢!
我也尝试过放弃 dplyr 并直接调用数据帧,但也不起作用:
new_roc <- function( df, anchor, na.rm = T) {
anchor <- enquo(anchor)
# Calculate and save this information as an object
# ci.auc() & roc() are from pROC package
"Var1 AUC CIs" = as.numeric (ci.auc (roc (data[[anchor], data[[namedvar1], smooth = FALSE,
direction = "<" ,ci = TRUE, boot.stratified = TRUE ) ) ),
"Var2 AUC CIs" = as.numeric (ci.auc (roc (data[[anchor], data[[namedvar2], smooth = FALSE,
direction = "<" ,ci = TRUE, boot.stratified = TRUE ) ) )
)
}
# Produces a different Error:
Error in .subset2(x, i, exact = exact) :
invalid subscript type 'language'
【问题讨论】:
-
I在输入数据中,列名正好是
anchor -
感谢@akrun,我已将输入数据更新为“anchor1”以匹配其余代码。 “anchor1”是实际使用公式时要指定的锚的示例。
-
请在我的解决方案中测试功能
-
澄清:解决方案不太有效 - 当我使用列名为 anchor1 的更新输入数据,然后调用 new_roc(df, anchor1) 时,我收到错误 Error: Column @987654332 @ 必须是长度 1(一个汇总值),而不是 3 ' 我尝试在您的解决方案中用 {{namedvar1}} 和 {{namedvar2}} 而不是 {{anchor}} 周围的大括号替换,但在 (function ( arg) : 找不到对象“namedvar1”。
-
更新了我的 dplyr,现在您的解决方案有效!谢谢!