【问题标题】:Error running pROC in R: Response and predictor must be vectors of the same length在 R 中运行 pROC 时出错:响应和预测变量必须是相同长度的向量
【发布时间】:2020-05-21 10:40:38
【问题描述】:

我将多元逻辑回归称为如下:

step_1 <- glm(CD3LR ~ alb + surg + ASA_opt + BMI + bil + Hb_cat + MDRD + sex + DM
              + age + Path + Smoking,
              na.action = na.exclude, family = binomial)

当我想通过创建 ROC 曲线来测试模型时,我使用 pROC 包并调用:

roc(CD3LR, step_1$fitted.values, plot=FALSE)

但是这会返回错误:

> roc(CD3LR, step_1fitted.values, plot=FALSE) 
Setting levels:control=0,case=1
Error in roc.default(CD3LR,step_1fitted.values, plot = FALSE) : 
  Response and predictor must be vectors of the same length.

我认为这是因为 MDRD 变量缺少 3 个值,并且因为我使用了 na.exclude,这导致 step_1$fitted.values 比 CD3LR 少 3 个

有没有办法仅使用与step_1$fitted.values 对应的CD3LR 值生成ROC 曲线??

非常感谢您的帮助!

【问题讨论】:

    标签: r glm proc-r-package


    【解决方案1】:

    我注意到你在环境中有你所有的变量,例如像这样,下面我介绍性别的 3NA 和 BMI 的 2 NA,

    CD3LR = as.numeric(runif(100)>0.5)
    alb = rnorm(100)
    surg = sample(1:3,100,replace=TRUE)
    ASA_opt = rpois(100,50)
    BMI = c(NA,NA,rpois(98,100))
    bil = rnorm(100)
    Hb_cat = sample(1:3,100,replace=TRUE)
    MDRD = runif(100)
    sex = c(sample(c("M","F"),98,replace=TRUE),NA,NA)
    DM = rnorm(100)
    age = sample(20:60,100,replace=TRUE)
    Path = rnorm(100)
    Smoking = sample(c("Yes","NI"),100,replace=TRUE)
    

    所以最好将它们全部放入一个data.frame中,进行拟合,然后是roc曲线:

    DataFrame = data.frame(
    CD3LR,alb,surg,ASA_opt,BMI,bil,Hb_cat,
    MDRD,sex,DM,age,Path,Smoking) 
    
    step_1<-glm(CD3LR~alb+surg+ASA_opt+BMI+bil+Hb_cat+MDRD+sex+DM+age+Path+Smoking,
    data=DataFrame,na.action=na.exclude,family=binomial)
    

    感谢@Calimo 指出,您也可以适应:

    step_1<-glm(CD3LR~.,
    data=DataFrame,na.action=na.exclude,family=binomial)
    

    这会给你错误:

    roc(DataFrame$CD3LR,step_1$fitted.values,plot=FALSE)
    

    我们可以做到:

    roc(step_1$y,step_1$fitted.values,plot=FALSE)
    

    或者:

    roc(DataFrame[complete.cases(DataFrame),"CD3LR"],step_1$fitted.values,plot=FALSE)
    

    拥有数据框的原因是您可以立即看到所有非 NA 的完整数据集。如果预测变量或响应中有任何 NA,则不会在回归中使用它。

    【讨论】:

    • 现在您有了这个不错的 data.frame,您可以将公式简化为 CD3LR ~ . 以使其更具可读性...并且逗号后可能还有一些空格?
    • 非常感谢您的帮助!我已经使用 readxl 从 Excel 中读取了数据,并且我刚刚定义了环境中的所有变量。我认为我出错的地方是我的 roc 调用:roc(CD3LR,step_1$fitted.values,plot=FALSE)。当我将 CD3LR 更改为 step_1$y 时,它运行良好!
    • 酷 :) 如果您对此答案感到满意,请随时接受和/或投票。更多信息:stackoverflow.com/help/someone-answers
    【解决方案2】:

    你的直觉是正确的,有些值已经被na.action=na.exclude过滤掉了。

    通常我会推荐使用predict 函数来获得对数据的新预测。它们看起来像这样:

    > predict(step_1)
    1           2           3           4           5           6           7   ...
    NA          NA  1.04059269  0.60248768  0.81502210  0.23992288  0.08421514  ...
    

    如您所见,MDRD 中的缺失值会生成NA,而不是被删除。

    然后您可以将这些预测直接提供给 roc 函数:

    roc(CD3LR, predict(step_1))
    

    【讨论】:

    • 以下是否也适用于 roc 调用?大鹏(step_1$y,step_1$fitted.values,plot=FALSE)。当我将 CD3LR 更改为 step_1$y 时,它似乎工作得很好!
    • @donm79 当然,但我建议使用 predict。然后,您可以使用 predict(step_1, newdata = TestDataFrame) 将测试数据集传递给它,而无需更改任何内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多