进行NRI分析时报错

遇到的现象和发生背景,请写出第一个错误信息

计算NRI和IDI,输入以下代码后报错

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
logistic.model.list <- 
  list(Basic_model=model_r, 
       New_model=model_ra)
reclassification(data =imputed_right, cOutcome = 1, 
                 predrisk1 = fitted(logistic.model.list[["Basic_model"]]), 
                 predrisk2 = fitted(logistic.model.list[["New_model"]]), 
                 cutoff = c(0, 0.30, 1))

运行结果及详细报错内容

img

我的解答思路和尝试过的方法

用as.factor将结局变量x1因子化,再次运行NRI分析的代码,依然是同样的报错

img

请问如何解决

根据您提供的信息,第一个错误信息是:

"Error in improveProb(x1 = as.numeric(c11) * (1/(length(levels(c11)))), y must have two values: 0 and 1"

此错误提示表明在计算NRI和IDI时出现了问题。根据错误信息,问题可能出现在输入数据中的因变量(y)的取值上。因变量应该是二分类的,即只包含0和1两个取值。

您提到尝试将结局变量(x1)使用as.factor函数转换为因子型,但仍然遇到相同的报错。为了解决这个问题,您可以进行以下操作:

  1. 确认结局变量的取值:检查一下结局变量(x1)的取值范围,确保只包含0和1两个值。可以使用以下代码查看结局变量的类别数量:

    table(imputed_right$x1)
    
  2. 检查数据类型:确保结局变量(x1)的数据类型是因子型(factor),可以使用以下代码将其转换为因子型:

    imputed_right$x1 <- as.factor(imputed_right$x1)
    
  3. 确保数据完整:检查数据中是否存在缺失值或其他异常情况,确保数据完整并且每个观测都有正确的结局变量值。

  4. 检查变量名:请确保代码中使用的变量名与数据集中的变量名一致。确保变量名的大小写和拼写都正确。

如果您仍然遇到相同的报错,请提供更多的代码和数据细节,以便我能够更深入地帮助您解决问题。

根据错误信息,可以看出 reclassification() 函数参数中的 predrisk1predrisk2 为空,这很可能是因为 fitted() 函数没有正确地返回一个预测结果向量。可以尝试修改代码,将 fitted() 函数替换为 predict() 函数来获取每个模型对观测值的预测结果向量。

修改后代码如下:

logistic.model.list <- 
  list(Basic_model=model_r, 
       New_model=model_ra)
reclassification(data =imputed_right, cOutcome = 1, 
                 predrisk1 = predict(logistic.model.list[["Basic_model"]], type = "response"), 
                 predrisk2 = predict(logistic.model.list[["New_model"]], type = "response"), 
                 cutoff = c(0, 0.30, 1))

其中 predict() 函数的 type 参数设为 "response" 以输出预测的概率向量。

使用 predict() 函数后,应该能够成功地运行 reclassification() 函数。

根据报错信息,错误原因可能是因为 fitted() 函数的参数类型不正确。fitted() 函数用于提取模型的拟合值,需要的参数是一个模型对象,但是在代码中提供的是一个包含模型对象的列表。因此,需要使用 [[ 运算符来从列表中提取模型对象,如下所示:

logistic.model.list <- 
  list(Basic_model=model_r, 
       New_model=model_ra)
reclassification(data =imputed_right, cOutcome = 1, 
                 predrisk1 = fitted(logistic.model.list[["Basic_model"]]), 
                 predrisk2 = fitted(logistic.model.list[["New_model"]]), 
                 cutoff = c(0, 0.30, 1))

在这个代码中,logistic.model.list[["Basic_model"]]logistic.model.list[["New_model"]] 分别用 [[ 运算符提取了列表 logistic.model.list 中的模型对象。这样,就可以将正确的模型对象传递给 fitted() 函数了。