原文链接:http://tecdat.cn/?p=6295
原文出处:拓端数据部落公众号
并非所有后果 / 因变量都能够应用线性回归进行正当建模。兴许第二种最常见的回归模型是逻辑回归,它实用于二元后果数据。如何计算逻辑回归模型的 R 平方?
McFadden 麦克法登 R 平方
在 R 中,glm(狭义线性模型)命令是用于拟合逻辑回归的规范命令。据我所知,拟合的 glm 对象并没有间接给你任何伪 R 平方值,但能够很容易地计算出 McFadden 的度量。为此,咱们首先拟合咱们感兴趣的模型,而后是仅蕴含截距的 null 模型。而后咱们能够应用拟合模型对数似然值计算 McFadden 的 R 平方:
mod < - glm(y~x,family =“binomial”)nullmod < - glm(y~1,family =“binomial”)1-logLik(MOD)/ logLik(nullmod)
为了理解预测器须要取得某个 McFadden 的 R 平方值的强度,咱们将应用单个预测模型 X 来模仿数据,咱们首先尝试 P(Y = 1 | X = 0)= 0.3 和 P(Y = 1 | X = 1)= 0.7:
set.seed(63126)n < - 10000
x < - 1 *((n)<0.5)pr < -(x == 1)* 0.7 +(x == 0)* 0.3
y < - 1 *(f(n)<pr)mod < - glm(y~x,family =“binomial”)nullmod < - glm(y~1,family =“binomial”)1-logLik(MOD)/(nullmod)'log Lik。' 0.1320256(df = 2)
因而,即便 X 对 Y = 1 的概率有相当强烈的影响,McFadden 的 R2 也只有 0.13。要减少它,咱们必须使 P(Y = 1 | X = 0)和 P(Y = 1 | X = 1)更加不同:
set.seed(63126)n < - 10000
x < - 1 *(runif(n)<0.5)pr < -(x == 1)* 0.9 +(x == 0)* 0.1
y < - 1 *((n)<pr)mod < - glm(y~x,family =“binomial”)nullmod < - glm(y~1,family =“binomial”)1-(MOD)/(nullmod)\[1\] 0.5539419
即便 X 将 P(Y = 1)从 0.1 变为 0.9,McFadden 的 R 平方仅为 0.55。最初咱们将尝试 0.01 和 0.99 的值 – 我称之为十分弱小的成果!
set.seed(63126)n < - 10000
x < - 1 *(runif(n)<0.5)pr < -(x == 1)* 0.99 +(x == 0)* 0.01
y < - 1 *((n)pr)mod < - glm(y~x,family =“binomial”)nullmod < - glm(y~1,family =“binomial”)1-(MOD)/()\[1\] 0.9293177
当初咱们有一个更靠近 1 的值。
分组二项数据与单个数据
data < - data.frame(s = c(700,300),f = c(300,700),x = c(0,1))SFX1 700 300 02 300 700 1
为了使逻辑回归模型拟合 R 中的数据,咱们能够将因变量传递给 glm 函数,:
Call:
glm(formula = cbind(s, f) ~ x, family = "binomial", data = data)
Deviance Residuals:
\[1\] 0 0
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.84730 0.06901 12.28 <2e-16 ***
x -1.69460 0.09759 -17.36 <2e-16 ***
\-\-\-
Signif. codes: 0‘***’0.001‘**’0.01‘*’0.05‘.’0.1‘’1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 3.2913e+02 on 1 degrees of freedom
Residual deviance: 1.3323e-13 on 0 degrees of freedom
AIC: 18.371
Number of Fisher Scoring iterations: 2
咱们当初将分组的二项式数据转换为 伯努利 数据,并拟合雷同的逻辑回归模型。
individualData <- (cbind(data,y=0),cbind(data,y=1))
individualData$freq <- individualData$s
individualData$freq\[$y==0\] <- $f\[individualData$y==0\]
mod2 <- glm(y~x, family="binomial",data= ,weight=freq)
summary(mod2)
Call:
glm(formula = y ~ x, family = "binomial", data = individualData,
weights = freq)
Deviance Residuals:
1 2 3 4
-26.88 -22.35 22.35 26.88
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.84730 0.06901 12.28 <2e-16 ***
x -1.69460 0.09759 -17.36 <2e-16 ***
\-\-\-
Signif. codes: 0‘***’0.001‘**’0.01‘*’0.05‘.’0.1‘’1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 2772.6 on 3 degrees of freedom
Residual deviance: 2443.5 on 2 degrees of freedom
AIC: 2447.5
Number of Fisher Scoring iterations: 4
正如所料,咱们从分组数据框中取得雷同的参数估计和推论。
nullmod1 <- glm(cbind(s,f)~1, family="binomial",data)
nullmod2 <- glm(y~1, family="binomial",data=individualData, =freq)
1-logLik(mod1)/logLik(nullmod1)
'log Lik.' 0.9581627 (df=2)
1-logLik(mod2)/logLik(nullmod2)
'log Lik.' 0.1187091 (df=2)
咱们看到分组数据模型的 R 平方为 0.96,而单个数据模型的 R 平方仅为 0.12。