如何根据R的logistic回归计算伪?


46

克里斯托弗·曼宁(Christopher Manning)关于R中逻辑回归的文章显示,R中的逻辑回归如下:

ced.logr <- glm(ced.del ~ cat + follows + factor(class), 
  family=binomial)

一些输出:

> summary(ced.logr)
Call:
glm(formula = ced.del ~ cat + follows + factor(class),
    family = binomial("logit"))
Deviance Residuals:
Min            1Q    Median       3Q      Max
-3.24384 -1.34325   0.04954  1.01488  6.40094

Coefficients:
              Estimate Std. Error z value Pr(>|z|)
(Intercept)   -1.31827    0.12221 -10.787 < 2e-16
catd          -0.16931    0.10032  -1.688 0.091459
catm           0.17858    0.08952   1.995 0.046053
catn           0.66672    0.09651   6.908 4.91e-12
catv          -0.76754    0.21844  -3.514 0.000442
followsP       0.95255    0.07400  12.872 < 2e-16
followsV       0.53408    0.05660   9.436 < 2e-16
factor(class)2 1.27045    0.10320  12.310 < 2e-16
factor(class)3 1.04805    0.10355  10.122 < 2e-16
factor(class)4 1.37425    0.10155  13.532 < 2e-16
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 958.66 on 51 degrees of freedom
Residual deviance: 198.63 on 42 degrees of freedom
AIC: 446.10
Number of Fisher Scoring iterations: 4

然后,他详细介绍了如何解释系数,比较不同的模型等等。非常有用。

但是,该模型占多少差异?一个逻辑回归塔塔页说:

从技术上讲,在逻辑回归中不能像在OLS回归中那样计算。在逻辑回归中,伪定义为,其中表示“仅恒定”模型的对数似然性,是具有以下项的完整模型的对数似然性常数和预测变量。R 2 1 L 1R2R2 L0L11L1L0L0L1

我从高水平理解这一点。仅常数模型将没有任何参数(仅拦截项)。对数似然度是参数拟合数据的紧密程度的度量。事实上,那种曼宁暗示的偏差可能是。也许零偏差仅是常数,而残余偏差则是模型的?但是,我不清楚。2 log L2logL2logL

有人可以使用此示例验证如何实际计算的伪吗?R2


5
通常情况下,出色的UCLA统计计算页面在这里犯了一个罕见的错误-伪的表达式中不应包含任何括号,即它应该是。(对不起,我要上床睡觉时没有回答您的问题,我敢肯定会有其他人在我醒来之前回答这个问题。) 1 L 1 / L 0R21L1/L0
一站式服务,


3
本页讨论了几个伪R ^ 2。
dfrankow 2011年

2
注意:相关问题不喜欢任何伪R ^ 2,而是更喜欢交叉验证或保持测试预测。
dfrankow 2011年

Answers:


49

不要忘了Frank Harrell 的rms软件包。您将找到安装和验证GLM所需的一切。

这是一个玩具示例(只有一个预测变量):

set.seed(101)
n <- 200
x <- rnorm(n)
a <- 1
b <- -2
p <- exp(a+b*x)/(1+exp(a+b*x))
y <- factor(ifelse(runif(n)<p, 1, 0), levels=0:1)
mod1 <- glm(y ~ x, family=binomial)
summary(mod1)

这样产生:

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   0.8959     0.1969    4.55 5.36e-06 ***
x            -1.8720     0.2807   -6.67 2.56e-11 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 258.98  on 199  degrees of freedom
Residual deviance: 181.02  on 198  degrees of freedom
AIC: 185.02

现在,使用该lrm功能,

require(rms)
mod1b <- lrm(y ~ x)

您很快会得到很多模型拟合指数,包括Nagelkerke,其具有:R2print(mod1b)

Logistic Regression Model

lrm(formula = y ~ x)

                      Model Likelihood     Discrimination    Rank Discrim.    
                         Ratio Test            Indexes          Indexes       

Obs           200    LR chi2      77.96    R2       0.445    C       0.852    
 0             70    d.f.             1    g        2.054    Dxy     0.705    
 1            130    Pr(> chi2) <0.0001    gr       7.801    gamma   0.705    
max |deriv| 2e-08                          gp       0.319    tau-a   0.322    
                                           Brier    0.150                     


          Coef    S.E.   Wald Z Pr(>|Z|)
Intercept  0.8959 0.1969  4.55  <0.0001 
x         -1.8720 0.2807 -6.67  <0.0001 

在此,,它被计算为,其中LR是 stat(比较您描述的两个嵌套模型),而分母只是的最大值。对于完美模型,我们期望,即。1 - EXP - LR / Ñ / 1 - EXP - - 2 大号0/ Ñ χ 2 - [R 2 LR = 2 大号0 - [R 2 = 1R2=0.445(1exp(LR/n))/(1exp((2L0)/n))χ2R2LR=2L0R2=1

用手,

> mod0 <- update(mod1, .~.-x)
> lr.stat <- lrtest(mod0, mod1)
> (1-exp(-as.numeric(lr.stat$stats[1])/n))/(1-exp(2*as.numeric(logLik(mod0)/n)))
[1] 0.4445742
> mod1b$stats["R2"]
       R2 
0.4445742 

Ewout W. Steyerberg 在他的《临床预测模型》(Springer,2009年,第4.2.2页,第58-60页)中讨论了与GLM 的使用。基本上,LR统计量与Nagelkerke的之间的关系是近似线性的(在发生率较低的情况下,它将更加线性)。现在,正如我在评论中链接到的较早线程上所讨论的那样,您可以使用其他度量,例如统计量,它等同于AUC统计量(上述参考中也有一个很好的说明,请参见图4.6)。R 2 cR2R2c


您能解释一下如何获得.445吗?我使用了1-exp(-77.96 / 200),但得到了.323。我做错了什么?谢谢。

2
Nagelkerke R2是哪一个?
JetLag

1
@JetLag在歧视指数下,Nagelkerke缩写为R2(即0.445)。您可以使用fmsb软件包中的函数NagelkerkeR2()进行检查。
Chernoff


7

注意R2的计算:

McFadden的伪计算为,其中是完整模型的对数似然性,是仅具有截距的模型的对数似然性。- [R 2 中号 = 1 - Ñ 大号 ˚F ù R2Ñ大号 ˚FüÑ大号 ˚FùRM2=1lnL^fulllnL^nulllnL^fulllnL^full

两种计算伪:R2

  1. 使用偏差:由于,因此deviance=2ln(Lfull)null.deviance=2ln(Lnull)

    pR2 = 1 - mod$deviance / mod$null.deviance # works for glm

但是上述方法不适用于样本外的伪R2

  1. 在R和定义中使用“ logLik”函数(也适用于示例)

    mod_null <- glm(y~1, family = binomial, data = insample) 1- logLik(mod)/logLik(mod_null)

可以对其稍加修改以计算出样本外的伪R2

例:

样本外伪R

通常,样本外伪计算为其中是基于样本内时间段的估计系数,样本外时间段的对数似然率,而是样本外时间段内仅截距模型的对数似然率。R2

Rp2=1Lest.outLnull.out,
Lest.outLnull.out

代码:

pred.out.link <- predict(mod, outSample, type = "link") mod.out.null <- gam(Default~1, family = binomial, data = outSample) pR2.out <- 1 - sum(outSample$y * pred.out.link - log(1 + exp(pred.out.link))) / logLik(mod.out.null)


deviance=2ln(Lfull)不适合二项式,只需查看model1 <- glm(cbind(ncases, ncontrols) ~ agegp + tobgp * alcgp, data = esoph, family = binomial)并调用model1$devianceand即可-2*logLik(model1)
好奇的

6

如果偏差与对数似然成正比,则使用定义(例如,参见McFadden的here

pseudo R^2 = 1 - L(model) / L(intercept)

那么上面的伪将是 = 0.7928R21198.63958.66

问题是:报告的偏差与对数可能性成正比吗?


3
此伪R ^ 2与@chl答案的Nagelkerke R ^ 2完全不同。
dfrankow 2011年

当我在学校时,偏差被定义为-2 * LL。
DWin

@dfrankow并不同意,因为Nagelkerke是Cox和Snell R2的规范化,与McFaddens R2不同。
科林

0

如果它超出样本,那么我认为必须使用相应的对数似然计算为,其中是在训练集上校准了预测模型的情况下,测试数据的对数似然性;在训练集上仅拟合了常数的模型中,是测试数据的对数似然性,然后使用常数以在计算概率的测试集上进行预测,从而获得对数似然率。R2R2=1llfullllconstantllfullllconstant

请注意,在线性回归中,类似的是,样本外的计算公式为,其中特别要注意分母项,则预测使用训练集的平均值。这就像如果我们仅用一个常数将模型拟合到训练数据中,那么我们必须最小化,从而导致,那么,这个简单的常数预测模型就是用作Benchamrk的模型(即oos的分母R2R2=1i(yiy^i)2i(yiy¯train)2i(yiy¯train)2y¯traini(yiβ0)2 β 0= ¯ ÿř一个ñ- [R2- [Rβ^0=y¯trainR2项)用于计算样本外。R2

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.