【问题标题】:How to evaluate goodness of fit of logistic regression model using residual.lrm in R?如何使用R中的residual.lrm评估逻辑回归模型的拟合优度?
【发布时间】:2018-08-22 04:25:35
【问题描述】:

我正在尝试评估我构建的逻辑回归模型的拟合优度。最初,建议我使用 Hosmer-Lemeshow 测试,但经过进一步研究,我了解到它不如 Hosmer et al 所指出的综合拟合优度测试可靠。据我了解,R rms 包中的 residual.lrm 是运行 le Cessie - van Houwelingen - Copas - Hosmer 未加权平方和检验的方法。

我已经构建了以下模型:

> NEDOCModel <- glm(complication ~ ultrasound + fNEDOC, family = "binomial", data = modelmain);
> summary(NEDOCModel);

Call:
glm(formula = complication ~ ultrasound + fNEDOC, family = "binomial", 
data = modelmain, x = TRUE, y = TRUE)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.5841  -0.5812  -0.4899  -0.4899   2.0878  

Coefficients:
                              Estimate Std. Error z value Pr(>|z|)    
(Intercept)                   -1.69293    0.10126 -16.719   <2e-16 ***
ultrasound1                   -0.36661    0.12514  -2.929   0.0034 **
fNEDOCOvercrowded (140 - 200)  0.01087    0.13524   0.080   0.9359    

---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

Null deviance: 1765.6  on 2284  degrees of freedom
Residual deviance: 1757.1  on 2282  degrees of freedom

AIC: 1763.1

Number of Fisher Scoring iterations: 4

其中并发症是二元结果(0 或 1),超声和 fNEDOC 是二元预测因子(0 或 1)。

按照residual.lrm 函数的描述(和示例),我收到以下错误:

> resid(NEDOCModel, "gof");
Error in match.arg(type) : 

'arg' should be one of “deviance”, “pearson”, “working”, “response”, “partial”

作为一个业余爱好者并且对这个领域比较陌生,如果能帮助我解决这个错误并提供指导以确保我正确评估我的模型,我将不胜感激。

提前致谢!

编辑:这是数据的一小部分:

simExample <- structure(list(complication = structure(c(1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("0", 
"1"), class = "factor"), ultrasound = structure(c(1L, 2L, 2L, 
1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 
1L), .Label = c("0", "1"), class = "factor"), fNEDOC = structure(c(1L, 
2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 
1L, 1L, 2L), .Label = c("Not Overcrowded (00 - 140)", "Overcrowded (140 -
200)"), class = "factor")), .Names = c("complication", "ultrasound",
"fNEDOC"), row.names = c(NA, 20L), class = "data.frame")

View(simExample)
   complication ultrasound                     fNEDOC
1             0          0 Not Overcrowded (00 - 140)
2             0          1    Overcrowded (140 - 200)
3             0          1 Not Overcrowded (00 - 140)
4             0          0 Not Overcrowded (00 - 140)
5             0          1 Not Overcrowded (00 - 140)
6             0          0 Not Overcrowded (00 - 140)
7             0          0 Not Overcrowded (00 - 140)
8             0          1    Overcrowded (140 - 200)
9             0          1 Not Overcrowded (00 - 140)
10            1          0    Overcrowded (140 - 200)
11            0          0 Not Overcrowded (00 - 140)
12            0          1 Not Overcrowded (00 - 140)
13            0          1 Not Overcrowded (00 - 140)
14            0          1    Overcrowded (140 - 200)
15            0          1    Overcrowded (140 - 200)
16            0          1 Not Overcrowded (00 - 140)
17            0          1 Not Overcrowded (00 - 140)
18            0          0 Not Overcrowded (00 - 140)
19            0          1 Not Overcrowded (00 - 140)
20            0          0    Overcrowded (140 - 200)

【问题讨论】:

  • 你命名的函数是residuals(),而不是resid()。你试过residuals(NEDOCModel, "gof")吗?寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。
  • @MrFlick 是的。我都试过了; resid()residuals() 的缩写。我会在几分钟内添加一小部分数据。
  • 您应该按照提供的链接中所述的可重现格式共享数据。您所展示的内容很难复制/粘贴到 R 中进行测试。
  • residuals.rlm 函数适用于使用 lrm() 函数创建的模型。您使用了glm() 函数,因此您需要查看?residuals.glm 帮助页面。 glm 模型没有“gof”选项。我什至不确定从帮助页面应该做什么。
  • @MrFlick 使用lrm() 构建模型确实允许resid() 函数正常工作。我只是想在离开并学习更多东西之前确认一下:lrm() 在这种情况下是glm() 的合适替代品,因为结果是二进制的?感谢您的帮助!

标签: r logistic-regression


【解决方案1】:

如果结果是二项式或有序的,则可以使用lrm。然而,对“适合”的广义度量的检查并不是我用来判断模型有效性的。我查看每个变量的残差以考虑非线性的可能性并评估需要rcs 样条函数以更好地拟合的可能性。您的示例不够复杂,无法支持该方法的演示。而且..你说的东西(你的问题中实际上没有包含代码)不“工作”(没有明确说明“工作”可能意味着什么。

library(rms)
NEDOCModel <- lrm(complication ~ ultrasound + fNEDOC, data = simExample, y=TRUE,x=TRUE);

 residuals(NEDOCModel)
#--------
 [1] -9.437191e-05 -1.746181e-04 -1.648351e-08 -9.437191e-05 -1.648351e-08 -9.437191e-05
 [7] -9.437191e-05 -1.746181e-04 -1.648351e-08  5.000005e-01 -9.437191e-05 -1.648351e-08
[13] -1.648351e-08 -1.746181e-04 -1.746181e-04 -1.648351e-08 -1.648351e-08 -9.437191e-05
[19] -1.648351e-08 -4.999995e-01
residuals(NEDOCModel,type="gof")
#-------
Sum of squared errors     Expected value|H0                    SD                     Z 
         0.5000001754          0.5012646602          0.0003628642         -3.4847333888 
                    P 
         0.0004926276 

但是,您应该学会使用 rms/Hmisc 互连功能系统的其余功能。您还没有定义datadist,因此summary 函数将不适用于lrm 类对象

ddist <- datadist(simExample)
options(datadist='ddist')

summary(NEDOCModel)
#-----------
            Effects              Response : complication 

 Factor                                                       Low High Diff. Effect     S.E.  
 ultrasound - 0:1                                             2   1    NA        8.6527 37.864
  Odds Ratio                                                  2   1    NA     5725.8000     NA
 fNEDOC - Overcrowded (140 -\n200):Not Overcrowded (00 - 140) 1   2    NA        9.2682 42.045
  Odds Ratio                                                  1   2    NA    10595.0000     NA
 Lower 0.95  Upper 0.95
 -6.5559e+01 8.2865e+01
  3.3731e-29 9.7195e+35
 -7.3139e+01 9.1676e+01
  1.7218e-32 6.5198e+39

【讨论】:

    猜你喜欢
    • 2022-10-04
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2017-01-02
    • 1970-01-01
    • 2020-07-31
    • 2014-05-25
    相关资源
    最近更新 更多