class: center, middle, inverse, title-slide .title[ # 逻辑斯蒂回归 ] .subtitle[ ## 社会学研究方法——第9讲 ] .author[ ### 李代 ] .institute[ ### 中国政法大学社会学院 ] .date[ ### 2025-04-24 ] --- class: center, middle, inverse <!-- background-image: url("images/cool.png") --> # 逻辑斯蒂回归 ## 比数比 ## 逻辑斯蒂回归 ## 多分类逻辑斯蒂回归 --- # 比数比 ## 线性回归 <img src="method-logit_files/figure-html/unnamed-chunk-2-1.png" style="display: block; margin: auto;" /> --- # 比数比 ## 线性回归 <img src="method-logit_files/figure-html/unnamed-chunk-3-1.png" style="display: block; margin: auto;" /> --- # 比数比 ## 线性回归
Characteristic
Beta
1
SE
(Intercept)
0.26
0.185
x
0.32***
0.018
R²
0.866
Adjusted R²
0.863
df
1
No. Obs.
50
Abbreviations: CI = Confidence Interval, SE = Standard Error
1
*p<0.05; **p<0.01; ***p<0.001
--- # 比数比 ## 线性回归 线性回归模型,是对变量之间相关关系的一种设想。它认为,变量之间存在“ 线性”的关系。也就是说,一条直线可以描述自变量与因变量之间的关系。 <!-- $$ y = \beta_0 + \beta_1 x_1 + \epsilon$$ --> 该模型认为,x每增加1单位,y增加0.32单位。当x=0时,y=0.26。 --- # 比数比 ## 最小二乘法 画一条直线,让每一个点和这条直线的垂直距离的平方和最小。 <img src="method-logit_files/figure-html/unnamed-chunk-5-1.png" style="display: block; margin: auto;" /> --- # 比数比 ## 线性回归模型的使用条件 1. 因变量是连续变量(定距、定比)。 1. x和y之间的关系是线性的(能写成上面一次方程的形式)。 1. 独立:误差之间彼此不相关。(Durbin-Watson检验) 1. 同分布:误差分布相同,方差一样大,均值为0。 1. 正态分布:误差符合正态分布。(Q-Q图) --- # 比数比 ## 线性回归不适用怎么办? 如果因变量不是连续变量,应该怎么办? 例如: 二分类变量:性别、好恶、中外…… 多分类变量:爱好、品牌、国籍…… 定序变量:教育程度、满意程度…… --- # 比数比 ## 比数比 发生比、比数:odds What are the **odds**? [国足仍有世界杯夺冠赔率 1赔3501倒数第二压泰国](https://www.163.com/sports/article/BJG7MT7700051C8M.html) 用1元钱赌中国队夺冠,中国队如果真的夺冠了,拿回来3501元钱。 odds: 1:3501 --- # 比数比 ## 升学率 假设有n个学生考大学,考上大学的人数是x。 升学率,是一个百分比,proportion。 `\(Proportion = \frac{x}{n}\)`. 概率,probability。概率不可观测,但可以通过统计推断推算。 `\(p = \frac{x}{n}\)`. 比数,也就是事件发生的概率比事件不发生的概率: `\(odds = \frac{p}{1-p}\)`. --- # 比数比 ## 升学率 .pull-left[ <img src="method-logit_files/figure-html/unnamed-chunk-6-1.png" style="display: block; margin: auto;" /> ] .pull-left[ <img src="method-logit_files/figure-html/unnamed-chunk-7-1.png" style="display: block; margin: auto;" /> ] --- # 比数比 ## 谁更占优势? 假设有m个男学生考大学,考上大学的男生人数是x。 假设有n个女学生考大学,考上大学的女生人数是y。 假如男生的升学率比女生大,是否说明男生更占优势? $$ p_1 - p_2 = \frac{x}{m} - \frac{y}{n} $$ $$ \frac{p_1}{p_2} = \frac{\frac{x}{m}}{\frac{y}{n}} $$ --- # 比数比 ## 谁更占优势? <img src="method-logit_files/figure-html/unnamed-chunk-8-1.png" style="display: block; margin: auto;" /> --- # 比数比 ## 比数比 odds ratio 男生升学的发生比是: `\(\frac{p_m}{1 - p_m}\)` 女生升学的发生比是: `\(\frac{p_f}{1 - p_f}\)` 比数比是: `\(\frac{\frac{p_m}{1 - p_m}}{\frac{p_f}{1 - p_f}}\)` --- # 比数比 ## 比数比 <img src="method-logit_files/figure-html/unnamed-chunk-9-1.png" style="display: block; margin: auto;" /> --- # 比数比 ## 比数比的对数(log odds ratio) <img src="method-logit_files/figure-html/unnamed-chunk-10-1.png" style="display: block; margin: auto;" /> --- class: center, middle, inverse <!-- background-image: url("images/cool.png") --> # 逻辑斯蒂回归 --- # 逻辑斯蒂回归 ## 泰坦尼克号  --- # 逻辑斯蒂回归 ## 泰坦尼克号 <img src="method-logit_files/figure-html/unnamed-chunk-11-1.png" style="display: block; margin: auto;" /> --- # 逻辑斯蒂回归 ## 泰坦尼克号 <div class="tabwid"><style>.cl-1302500e{}.cl-12f77738{font-family:'Arial';font-size:11pt;font-weight:normal;font-style:normal;text-decoration:none;color:rgba(0, 0, 0, 1.00);background-color:transparent;}.cl-12fabd94{margin:0;text-align:left;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);padding-bottom:5pt;padding-top:5pt;padding-left:5pt;padding-right:5pt;line-height: 1;background-color:transparent;}.cl-12fabd9e{margin:0;text-align:right;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);padding-bottom:5pt;padding-top:5pt;padding-left:5pt;padding-right:5pt;line-height: 1;background-color:transparent;}.cl-12fad8b0{width:0.75in;background-color:transparent;vertical-align: middle;border-bottom: 1.5pt solid rgba(102, 102, 102, 1.00);border-top: 1.5pt solid rgba(102, 102, 102, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-12fad8ba{width:0.75in;background-color:transparent;vertical-align: middle;border-bottom: 1.5pt solid rgba(102, 102, 102, 1.00);border-top: 1.5pt solid rgba(102, 102, 102, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-12fad8bb{width:0.75in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-12fad8c4{width:0.75in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-12fad8c5{width:0.75in;background-color:transparent;vertical-align: middle;border-bottom: 1.5pt solid rgba(102, 102, 102, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-12fad8c6{width:0.75in;background-color:transparent;vertical-align: middle;border-bottom: 1.5pt solid rgba(102, 102, 102, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}</style><table data-quarto-disable-processing='true' class='cl-1302500e'><thead><tr style="overflow-wrap:break-word;"><th class="cl-12fad8b0"><p class="cl-12fabd94"><span class="cl-12f77738">class</span></p></th><th class="cl-12fad8ba"><p class="cl-12fabd9e"><span class="cl-12f77738">No</span></p></th><th class="cl-12fad8ba"><p class="cl-12fabd9e"><span class="cl-12f77738">Yes</span></p></th><th class="cl-12fad8ba"><p class="cl-12fabd9e"><span class="cl-12f77738">p</span></p></th><th class="cl-12fad8ba"><p class="cl-12fabd9e"><span class="cl-12f77738">1-p</span></p></th><th class="cl-12fad8ba"><p class="cl-12fabd9e"><span class="cl-12f77738">odds</span></p></th><th class="cl-12fad8ba"><p class="cl-12fabd9e"><span class="cl-12f77738">or</span></p></th><th class="cl-12fad8ba"><p class="cl-12fabd9e"><span class="cl-12f77738">log or</span></p></th></tr></thead><tbody><tr style="overflow-wrap:break-word;"><td class="cl-12fad8bb"><p class="cl-12fabd94"><span class="cl-12f77738">1st</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">122</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">203</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">0.625</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">0.375</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">1.664</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">5.282</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">1.664</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-12fad8bb"><p class="cl-12fabd94"><span class="cl-12f77738">2nd</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">167</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">118</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">0.414</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">0.586</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">0.707</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">2.243</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">0.808</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-12fad8bb"><p class="cl-12fabd94"><span class="cl-12f77738">3rd</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">528</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">178</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">0.252</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">0.748</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">0.337</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">1.070</span></p></td><td class="cl-12fad8c4"><p class="cl-12fabd9e"><span class="cl-12f77738">0.068</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-12fad8c5"><p class="cl-12fabd94"><span class="cl-12f77738">Crew</span></p></td><td class="cl-12fad8c6"><p class="cl-12fabd9e"><span class="cl-12f77738">673</span></p></td><td class="cl-12fad8c6"><p class="cl-12fabd9e"><span class="cl-12f77738">212</span></p></td><td class="cl-12fad8c6"><p class="cl-12fabd9e"><span class="cl-12f77738">0.240</span></p></td><td class="cl-12fad8c6"><p class="cl-12fabd9e"><span class="cl-12f77738">0.760</span></p></td><td class="cl-12fad8c6"><p class="cl-12fabd9e"><span class="cl-12f77738">0.315</span></p></td><td class="cl-12fad8c6"><p class="cl-12fabd9e"><span class="cl-12f77738">1.000</span></p></td><td class="cl-12fad8c6"><p class="cl-12fabd9e"><span class="cl-12f77738">0.000</span></p></td></tr></tbody></table></div> 因为 `\(OR > 1\)` 或者 `\(log or > 0\)`,乘客跟船员比都更容易幸存,一等舱最容易幸存,其次是二等舱,再次是三等舱。 --- # 逻辑斯蒂回归 ## 泰坦尼克号
Characteristic
log(OR)
1
SE
(Intercept)
-1.2***
0.079
Class
Crew
—
—
1st
1.7***
0.139
2nd
0.81***
0.144
3rd
0.07
0.117
AIC
2,597
No. Obs.
2,201
Abbreviations: CI = Confidence Interval, OR = Odds Ratio, SE = Standard Error
1
*p<0.05; **p<0.01; ***p<0.001
--- # 星球大战  --- # 星球大战 角色的性别与身高 <img src="method-logit_files/figure-html/unnamed-chunk-14-1.png" style="display: block; margin: auto;" /> --- # 星球大战 线性关系可以很好的描述两个变量之间的关系吗? <img src="method-logit_files/figure-html/unnamed-chunk-15-1.png" style="display: block; margin: auto;" /> --- # 逻辑斯蒂回归(logistic regression) 连接函数是logit函数的回归: `\(logit(x) = log(\frac{x}{1-x})\)` <img src="method-logit_files/figure-html/unnamed-chunk-16-1.png" style="display: block; margin: auto;" /> --- # 逻辑斯蒂回归(logistic regression)
Characteristic
log(OR)
1
SE
(Intercept)
-15**
5.42
height
0.09**
0.031
AIC
57.0
No. Obs.
64
Abbreviations: CI = Confidence Interval, OR = Odds Ratio, SE = Standard Error
1
*p<0.05; **p<0.01; ***p<0.001
--- # 定类变量vs连续变量 泰坦尼克号的结果是把定类变量作为虚拟变量放入模型得到的。可以把它看成是logit函数的一种特殊情况。 假如自变量 `\(x\)`的取值是 `\(0 = 船员, 1 = 一等舱\)`。 当 `\(x = 0\)`时, `\(log(\frac{p_0}{1-p_0}) = \alpha\)`。此时对等式两边同时取指数,可得 `\(or_0 = \frac{p_0}{1-p_0} = e^{\alpha}\)`,这是船员幸存的比数。 当 `\(x = 1\)`时, `\(log(\frac{p_1}{1-p_1}) = \alpha + \beta_1\)`。此时对等式两边同时取指数,可得 `\(or_1 = \frac{p_1}{1-p_1} = e^{\alpha + \beta_1}\)`,这是一等舱乘客幸存的比数。 两个比数如果相除,会得到什么? $$ \frac{or_1}{or_0} = \frac{e ^{\alpha + \beta_1}}{e^{\alpha }} = e^{\beta_1} $$ --- # 定类变量vs连续变量 所以说,通过logit函数作为连接函数得到模型系数,这个系数恰好是**比数比的对数**。在写作中,有时不报告模型系数而是**比数比**,亦可。
Characteristic
OR
1
SE
(Intercept)
0.00**
5.42
height
1.10**
0.031
AIC
57.0
No. Obs.
64
Abbreviations: CI = Confidence Interval, OR = Odds Ratio, SE = Standard Error
1
*p<0.05; **p<0.01; ***p<0.001
--- class: center, middle, inverse <!-- background-image: url("images/cool.png") --> # 多分类逻辑斯蒂回归 --- # 多分类逻辑斯蒂回归 multinomial logistic regression 逻辑斯蒂回归对应变量是二分变量,也就是因变量取值为0或1。其实我们已经看到,因变量取值在0-1之间的连续变量亦可用逻辑斯蒂回归。 如果变量是多分类的怎么办? 注意区分: + 多分类逻辑斯蒂回归的意思是因变量是取值超过2种情况的定类变量; + 多元逻辑斯蒂回归指的是可以放入多个自变量 --- # 多分类逻辑斯蒂回归 <img src="method-logit_files/figure-html/unnamed-chunk-19-1.png" style="display: block; margin: auto;" /> --- # 多分类逻辑斯蒂回归 <iframe src="image/m5.html" width="100%" height="400px" data-external="1"></iframe> --- # 有序逻辑斯蒂回归 .pull-left[ ordered logit 因变量是定序变量时,采用有序逻辑斯蒂回归模型进行分析。 ] .pull-right[
Characteristic
log(OR)
95% CI
1|2
-0.81
2|3
0.16
3|4
1.0
4|5
3.0
lat
-0.07
-0.08, -0.06
long
-0.02
-0.02, -0.01
Log-likelihood
-5,794
AIC
11,599
No. Obs.
4,803
Abbreviations: CI = Confidence Interval, OR = Odds Ratio
] --- # 代码 一般的逻辑斯蒂回归:使用自带的`stats`包的`glm`函数。最简单的形式是: `glm(y~x, family = binomial, data = dt)`。其中,binomial表示因变量是二分类变量。 多分类的逻辑斯蒂回归:使用`nnet`包的`multinom`函数。最简单的形式是: `multinom(y~x, data = dt)`。此外还有`mlogit`包可用。`multinom`的结果不好用`modelsummary`、`flextable`、`gtsummary`之类的包处理,目前只能用`stargazer`来处理。 有序的逻辑斯蒂回归:使用`MASS`包的`polr`函数,最简单的形式是: `polr(y~x, data = dt)`。模型自带结果不含 `\(p\)`值,不手动计算的话报告不带星星。 [本课代码](method-logit.Rmd) <!-- --- --> <!-- # 多分类逻辑斯蒂回归 --> <!-- ```{r} --> <!-- dt <- dt %>% subset(gear != "5") --> <!-- mtcars$gear --> <!-- dt$gear <- dt$gear == "4" --> <!-- m6 <- glm(gear ~ mpg, data = dt, family = binomial) --> <!-- tbl_regression(m6, intercept = T, exponentiate = F) %>% add_significance_stars () %>% --> <!-- add_glance_table(include = (broom::glance(m6) %>% colnames())[c(4,8)]) --> <!-- ``` --> <!-- --- --> <!-- # 逻辑斯蒂回归 --> <!-- ## 泰坦尼克号 --> <!--  --> <!-- --- --> <!-- # 逻辑斯蒂回归 --> <!-- ## 泰坦尼克号 --> <!-- ```{r} --> <!-- dt <- Titanic %>% as.data.frame() %>% uncount() --> <!-- dt %>% colnames() --> <!-- # ggplot(data = dt, aes(x = Class, y = Survived)) + geom_jitter() --> <!-- ``` --> <!-- # 逻辑斯蒂回归 --> <!-- ## 泰坦尼克号 --> <!-- 假如把船员当成“四等仓”,从而把乘客身份看成是1-4的连续变量,如何? --> <!-- ```{r} --> <!-- dt$class_numeric <- ifelse(dt$Class == "1st", 1, ifelse( --> <!-- dt$Class == "2nd", 2, ifelse(dt$Class == "3rd", 3, 4) --> <!-- )) + rnorm(nrow(dt), mean = 0, sd = 0.1) --> <!-- dt$survived2 <- dt$survived %>% as.numeric() --> <!-- m3 <-glm(survived ~ class_numeric, dt, family="binomial") --> <!-- dt$fit <- m3$fitted.values --> <!-- ggplot(dt, aes(x = class_numeric, y = survived2)) + geom_point() + --> <!-- geom_line(aes(x = class_numeric,y = fit)) --> <!-- # stat_function(fun=function(x) predict(m3)) --> <!-- # stat_smooth(method = "glm",method.args = list(family = "binomial")) --> <!-- ``` -->