class: center, middle, inverse, title-slide .title[ # 线性回归进阶 ] .subtitle[ ## 社会统计学——第10讲 ] .author[ ### 李代 ] .institute[ ### 中国政法大学社会学院 ] .date[ ### 2025-04-29 ] --- class: center, middle, inverse <!-- background-image: url("images/cool.png") --> # 线性回归进阶 ## 交互项 ## 其他技巧 ## 注意 --- # 交互项 ## 星球大战的人物 <img src="image/sw.jpg" width="2560" /> --- # 交互项 ## 星球大战人物数据 <!-- --> --- # 交互项 ## 多元线性回归 <!-- --> 如果直接把变量放入多元线性回归,系数表示的不同人群之间的平均差别。 --- # 交互项 ## 多元线性回归 回归方程: `$$\text{mass} = \beta_0 + \beta_1 \text{height} + \beta_2 \text{sex}$$` 对于 `\(text{sex}=1\)`, 代入式子得到: `$$\hat{\text{mass}}_{(\text{sex}=1)} = \beta_0 + \beta_1 \text{height} + \beta_2 \times 1$$` 对于 `\(text{sex}=0\)`, 代入式子得到: `$$\hat{\text{mass}}_{(\text{sex}=0)} = \beta_0 + \beta_1 \text{height} + \beta_2 \times 0$$` 两个式子相减,得到: `$$\hat{\text{mass}}_{(\text{sex}=1)} - \hat{\text{mass}}_{(\text{sex}=0)} = \beta_2$$` 可见对于任意给定的 `\(\text{height}_i\)`,男女之间 `\(\text{mass}\)` 的差是常数,由 `\(\beta_2\)` 也就是性别变量的系数表示。由于是一个常数,说明两条直线是平行的。 --- # 交互项 ## 交互项(interaction) <!-- --> --- # 交互项 ## 交互项 `$$\text{mass} = \beta_0 + \beta_1 \text{height} + \beta_2 \text{sex} + \beta_3 \text{height} \cdot \text{sex}$$` 对于 `\(\text{sex}=1\)`, 代入式子得到: `$$\hat{\text{mass}}_{(\text{sex}=1)} = \beta_0 + \beta_1 \text{height} + \beta_2 \times 1 + \beta_3 \text{height} \times 1 = (\beta_0 + \beta_2) + (\beta_1 + \beta_3)\text{height}$$` 对于 `\(\text{sex}=0\)`, 代入式子得到: `$$\hat{\text{mass}}_{(\text{sex}=0)} = \beta_0 + \beta_1 \text{height} + \beta_2 \times 0 + \beta_3 \text{height} \times 0 = \beta_0 + \beta_1 \text{height}$$` 两个式子相减,得到: `$$\hat{\text{mass}}_{(\text{sex}=1)} - \hat{\text{mass}}_{(\text{sex}=0)} = \beta_2 + \beta_3 \text{height}$$` 可见对于给定的 `\(\text{height}_i\)`,男女之间 `\(\text{mass}\)` 的差是变化的,由 `\(\beta_2 + \beta_3 \text{height}_i\)` 表示,取决于 `\(\text{height}_i\)`。 --- # 交互项 ## 交互项 交互的可以是两个虚拟变量,一个虚拟变量和一个连续变量,或者两个连续变量。 `$$\text{mass} = \beta_0 + \beta_1 \text{height} + \beta_2 x + \beta_3 \text{height} \cdot x$$` 对于 `\(x=m+1\)`, 代入式子得到: `$$\hat{\text{mass}_{(x=m+1)}} = \beta_0 + \beta_1 \text{height} + \beta_2 \times (m+1) + \beta_3 \text{height} \times (m+1) = [\beta_0 + \beta_2 \times (m + 1)] + [\beta_1 + \beta_3\times (m + 1)]\text{height}$$` 对于 `\(x=m\)`, 代入式子得到: `$$\hat{\text{mass}_{(x=m)}} = \beta_0 + \beta_1 \text{height} + \beta_2 \times m + \beta_3 \text{height} \times m = (\beta_0 + \beta_2 \times m)+ (\beta_1 + \beta_3 \times m) \text{height}$$` 两个式子相减,得到: `$$\hat{\text{mass}_{(x=m+1)}} - \hat{\text{mass}_{(x=m)}} = \beta_2 + \beta_3 \text{height}$$` --- # 交互项 ## 交互项 `$$\hat{\text{mass}_{(x=m+1)}} - \hat{\text{mass}_{(x=m)}} = \beta_2 + \beta_3 \text{height}$$` 若 `$$\hat{\text{mass}_{(x=m+1)}} - \hat{\text{mass}_{(x=m)}} > 0$$` `$$\beta_2 + \beta_3 \text{height} > 0$$` <!-- `$$\text{height} > \frac{-\beta_2}{\beta_3}$$` --> 可见存在一个 `\(\text{height}\)` 的取值,令 `\(x\)` 增加的时候 `\(\text{mass}\)` 的变化趋势发生改变。对交互项的阐述,即通过对这一相对关系的描述完成。 --- # 交互项 ## 交互项 对回归方程的系数进行假设检验,如何看待系数的显著性? 由于交互项本身是两个变量相乘得到的,要说明交互项描述的关系是显著的,最好是交互项和涉及的变量自己的系数都显著。 交互项可以不只两项,想有多少项都行,交互系数的含义可以通过前述的方式求导。但是交互项多了之后解释起来会很复杂。 --- # 交互项 ## 交互项 .pull-left[ <table style="NAborder-bottom: 0; color: black; width: auto !important; margin-left: auto; margin-right: auto; font-size: 10px; color: black; margin-left: auto; margin-right: auto;" class="table table table-striped table-condensed"> <thead> <tr> <th style="text-align:left;"> </th> <th style="text-align:center;"> 简单 </th> <th style="text-align:center;"> 多元 </th> <th style="text-align:center;"> 交互项 </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> (Intercept) </td> <td style="text-align:center;"> -30.974* </td> <td style="text-align:center;"> -46.053*** </td> <td style="text-align:center;"> 82.859 </td> </tr> <tr> <td style="text-align:left;"> </td> <td style="text-align:center;"> (13.650) </td> <td style="text-align:center;"> (12.974) </td> <td style="text-align:center;"> (91.021) </td> </tr> <tr> <td style="text-align:left;"> height </td> <td style="text-align:center;"> 0.604*** </td> <td style="text-align:center;"> 0.587*** </td> <td style="text-align:center;"> -0.164 </td> </tr> <tr> <td style="text-align:left;"> </td> <td style="text-align:center;"> (0.076) </td> <td style="text-align:center;"> (0.068) </td> <td style="text-align:center;"> (0.530) </td> </tr> <tr> <td style="text-align:left;"> sexmale </td> <td style="text-align:center;"> </td> <td style="text-align:center;"> 21.900*** </td> <td style="text-align:center;"> -109.224 </td> </tr> <tr> <td style="text-align:left;"> </td> <td style="text-align:center;"> </td> <td style="text-align:center;"> (6.146) </td> <td style="text-align:center;"> (91.859) </td> </tr> <tr> <td style="text-align:left;"> height × sexmale </td> <td style="text-align:center;"> </td> <td style="text-align:center;"> </td> <td style="text-align:center;"> 0.764 </td> </tr> <tr> <td style="text-align:left;box-shadow: 0px 1.5px"> </td> <td style="text-align:center;box-shadow: 0px 1.5px"> </td> <td style="text-align:center;box-shadow: 0px 1.5px"> </td> <td style="text-align:center;box-shadow: 0px 1.5px"> (0.534) </td> </tr> <tr> <td style="text-align:left;"> Num.Obs. </td> <td style="text-align:center;"> 51 </td> <td style="text-align:center;"> 51 </td> <td style="text-align:center;"> 51 </td> </tr> <tr> <td style="text-align:left;"> R2 </td> <td style="text-align:center;"> 0.564 </td> <td style="text-align:center;"> 0.655 </td> <td style="text-align:center;"> 0.670 </td> </tr> <tr> <td style="text-align:left;"> R2 Adj. </td> <td style="text-align:center;"> 0.555 </td> <td style="text-align:center;"> 0.641 </td> <td style="text-align:center;"> 0.649 </td> </tr> <tr> <td style="text-align:left;"> AIC </td> <td style="text-align:center;"> 446.7 </td> <td style="text-align:center;"> 436.8 </td> <td style="text-align:center;"> 436.6 </td> </tr> <tr> <td style="text-align:left;"> BIC </td> <td style="text-align:center;"> 452.5 </td> <td style="text-align:center;"> 444.5 </td> <td style="text-align:center;"> 446.2 </td> </tr> <tr> <td style="text-align:left;"> Log.Lik. </td> <td style="text-align:center;"> -220.366 </td> <td style="text-align:center;"> -214.381 </td> <td style="text-align:center;"> -213.294 </td> </tr> <tr> <td style="text-align:left;"> F </td> <td style="text-align:center;"> 63.395 </td> <td style="text-align:center;"> 45.613 </td> <td style="text-align:center;"> 31.754 </td> </tr> <tr> <td style="text-align:left;"> RMSE </td> <td style="text-align:center;"> 18.21 </td> <td style="text-align:center;"> 16.19 </td> <td style="text-align:center;"> 15.85 </td> </tr> </tbody> <tfoot><tr><td style="padding: 0; " colspan="100%"> <sup></sup> + p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001</td></tr></tfoot> </table> ] .pull-right[ 交互项及其涉及的变量自己的系数反映在这些变量取值不同时**斜率**不同的线性关系。 `$$\begin{aligned} \operatorname{mass} &= 47.37 + 0.043(\operatorname{height})\ - 73.267(\operatorname{sex}_{\operatorname{male}}) + \\ &\quad 0.558(\operatorname{height} \times \operatorname{sex}_{\operatorname{male}})\ + \epsilon \end{aligned}$$` 系数突然都变得不显著了。这是由于女生样本太少,导致假设检验结果不显著。 ] --- # 交互项 ## 交互项 如果仅看男性数据,系数显著。 <table style="NAborder-bottom: 0; color: black; width: auto !important; margin-left: auto; margin-right: auto; font-size: 12px; color: black; margin-left: auto; margin-right: auto;" class="table table table-striped table-condensed"> <thead> <tr> <th style="text-align:left;"> </th> <th style="text-align:center;"> 男性子集 </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> (Intercept) </td> <td style="text-align:center;"> -26.365+ </td> </tr> <tr> <td style="text-align:left;"> </td> <td style="text-align:center;"> (13.117) </td> </tr> <tr> <td style="text-align:left;"> height </td> <td style="text-align:center;"> 0.600*** </td> </tr> <tr> <td style="text-align:left;box-shadow: 0px 1.5px"> </td> <td style="text-align:center;box-shadow: 0px 1.5px"> (0.072) </td> </tr> <tr> <td style="text-align:left;"> Num.Obs. </td> <td style="text-align:center;"> 42 </td> </tr> <tr> <td style="text-align:left;"> R2 </td> <td style="text-align:center;"> 0.633 </td> </tr> <tr> <td style="text-align:left;"> R2 Adj. </td> <td style="text-align:center;"> 0.624 </td> </tr> <tr> <td style="text-align:left;"> AIC </td> <td style="text-align:center;"> 363.6 </td> </tr> <tr> <td style="text-align:left;"> BIC </td> <td style="text-align:center;"> 368.8 </td> </tr> <tr> <td style="text-align:left;"> Log.Lik. </td> <td style="text-align:center;"> -178.786 </td> </tr> <tr> <td style="text-align:left;"> F </td> <td style="text-align:center;"> 68.951 </td> </tr> <tr> <td style="text-align:left;"> RMSE </td> <td style="text-align:center;"> 17.08 </td> </tr> </tbody> <tfoot><tr><td style="padding: 0; " colspan="100%"> <sup></sup> + p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001</td></tr></tfoot> </table> --- class: center, middle, inverse <!-- background-image: url("images/cool.png") --> # 其他技巧 --- # 其他技巧 ## 二次项 人的身高线性增长,体积却指数级增长。身高和体重的关系可能不是一条直线的关系? 例如:姚明,身高226厘米,体重137公斤,鞋码52-56号。 如果按照身高比例换算,你的体重和鞋码该是多大? 身高和体重之间有没有可能是这样的关系?(抛物线) `$$\operatorname{mass} = \beta_0 + \beta_{1}(\operatorname{height}) + \beta_{2}(\operatorname{height}^2) + \epsilon$$` --- # 其他技巧 ## 二次项 <!-- --> <!-- https://www.datacamp.com/community/tutorials/r-formula-tutorial --> --- # 其他技巧 ## 二次项 结果不显著,说明用一次项就行了。 <table style="NAborder-bottom: 0; color: black; width: auto !important; margin-left: auto; margin-right: auto; font-size: 10px; color: black; margin-left: auto; margin-right: auto;" class="table table table-striped table-condensed"> <thead> <tr> <th style="text-align:left;"> </th> <th style="text-align:center;"> 二次项 </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> (Intercept) </td> <td style="text-align:center;"> 4.750 </td> </tr> <tr> <td style="text-align:left;"> </td> <td style="text-align:center;"> (32.532) </td> </tr> <tr> <td style="text-align:left;"> height </td> <td style="text-align:center;"> 0.088 </td> </tr> <tr> <td style="text-align:left;"> </td> <td style="text-align:center;"> (0.434) </td> </tr> <tr> <td style="text-align:left;"> I(height^2) </td> <td style="text-align:center;"> 0.002 </td> </tr> <tr> <td style="text-align:left;box-shadow: 0px 1.5px"> </td> <td style="text-align:center;box-shadow: 0px 1.5px"> (0.001) </td> </tr> <tr> <td style="text-align:left;"> Num.Obs. </td> <td style="text-align:center;"> 51 </td> </tr> <tr> <td style="text-align:left;"> R2 </td> <td style="text-align:center;"> 0.577 </td> </tr> <tr> <td style="text-align:left;"> R2 Adj. </td> <td style="text-align:center;"> 0.559 </td> </tr> <tr> <td style="text-align:left;"> AIC </td> <td style="text-align:center;"> 447.2 </td> </tr> <tr> <td style="text-align:left;"> BIC </td> <td style="text-align:center;"> 454.9 </td> </tr> <tr> <td style="text-align:left;"> Log.Lik. </td> <td style="text-align:center;"> -219.602 </td> </tr> <tr> <td style="text-align:left;"> F </td> <td style="text-align:center;"> 32.726 </td> </tr> <tr> <td style="text-align:left;"> RMSE </td> <td style="text-align:center;"> 17.94 </td> </tr> </tbody> <tfoot><tr><td style="padding: 0; " colspan="100%"> <sup></sup> + p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001</td></tr></tfoot> </table> --- # 其他技巧 ## 二次项 如果二次项和自变量自己的系数显著,可以将其看成一条抛物线,根据中学的知识,可以根据一次和二次项的系数来判断抛物线的开口方向、顶点坐标和变化趋势。顶点坐标: `\((-\frac{b}{2a}, \frac{4ac-b^2}{4a})\)` <!-- --> --- # 其他技巧 ## 多次项 当然,也可以是更高次项。例如三次项: <!-- --> --- # 其他技巧 ## 对数项 如果某个变量的分布有一些特别大或者特别小的值,可以考虑对其进行取自然对数的处理。例如,对数正态分布,取自然对数后会变成正态分布。 --- # 其他技巧 ## 对数项 经济学对对数项的解释:相当于近似成百分数。 1. 如果对因变量取对数,自变量系数可以理解为自变量每增加一单位,因变量增加百分之几。 1. 如果对自变量取对数,自变量系数可以理解为自变量每增加1%,因变量增加几单位。 1. 如果对自变量和因变量都取对数,自变量系数可以理解为自变量每增加1%,因变量增加百分之几。 这是一种近似。 --- # 其他技巧 ## 对变量进行标准化 对自变量进行标准化(Z分数),使其平均值变成0、标准差变为1。此时变量系数的含义发生了变化,表示自变量每增加1标准差,因变量发生的变化。 同理,可以对因变量进行标准化。 --- class: center, middle, inverse <!-- background-image: url("images/cool.png") --> # 注意 --- # 注意 ## 完全共线性 如果自变量 $$ \beta_0 = \beta_1 x_1 + \beta_2 x_2 + \beta_3 x_3 + ... + \beta_n x_n$$ 说明自变量 `\(x_1 ... x_n\)` **完全共线**。 一组自变量如果完全共线,同时放到模型中,模型无法计算。 为什么对于有n个取值的分类变量,要形成n-1个虚拟变量? 例如本课中的性别变量,取值为男的人一定不为女。所以, `\(1 = \text{sexmale} + \text{sexfemale}\)`,二者完全共线。 不放正好,不放的那个变量就是参照组。 如果一组变量相关性比较强,接近完全共线,会导致这些变量的系数不显著。 怎么理解?因为其中一个自变量已经包含了大多数与之共线变量的信息,那些变量就多余了。 --- # 注意 ## 虚拟变量(Dummy Variable) 把分类变量(categorical variable, 包括定类变量、定序变量) 虚拟变量:让性别为女 = 0,男= 1,加入模型。 性别变量转化为:“性别为男”是否为真。 如果有n个取值,就将其转化为 n - 1 个取值为0或1的变量,例如: 原变量:喜欢吃{中餐or西餐or日餐or其他} 新变量:是否喜欢吃中餐+是否喜欢吃西餐+是否喜欢吃日餐?(其他是参照组) 变量系数的含义:跟喜欢吃其他的人相比,喜欢吃中餐/西餐/日餐的人,因变量平均高... --- # 注意 ## 虚拟变量 为什么取值有n个,变成 n-1 个变量?如果全放进模型就导致完全共线。 因为一个人至少选了其中一个取值(相应虚拟变量值为1,剩下的值为0),所以: $$ 1 = 是否喜欢吃中餐 + 是否喜欢吃西餐 + 是否喜欢吃日餐 + 是否喜欢吃其他$$ 这会导致完全共线,让线性回归没法跑。 --- # 注意 ## 一言不合就线性回归 线性回归是最基础的统计模型,因而经常能在论文中看到。 当使用条件满足时,先进行一下线性回归可以帮自己寻找思路。 当因变量是连续变量时,使用线性回归。 当因变量是分类变量时,用逻辑斯蒂回归。 如果因变量取值有特定范围(例如0-1),即使是连续变量(例如百分比),也建议用逻辑斯蒂回归。 --- # 注意 ## 显著性问题 是不是应该不断尝试,直到所有系数都显著? 不应该。 系数不显著的变量,还应该留在模型里吗? 有可能。 控制变量:只是起到“当...不变的时候”的限制作用,其系数不显著说明它对因变量影响不显著,不意味着应该去除。 --- # 注意 ## 模型筛选 是不是 `\(R^2\)` 越大的模型越好? 不是。 模型自变量越多, `\(R^2\)` 就越大。但是这不一定是由于模型的解释力提高了,而是由于错把噪音当信号。**“过拟合”(overfitting)** 模型筛选主要参照 AIC、 BIC,数越小模型越好。 但是最终还是应该根据理论来选择模型。 --- # 注意 ## 模型效果不好时怎么办? 1. 数据问题。有可能样本过小,或者样本在抽样时存在偏误,导致模型得不到预想的结果。解决方案:扩大/重新抽样。 1. 模型问题。有可能线性回归的假设被违背,例如残差分布不正态、模型存在内生性(模型自变量与误差项相关、自变量与因变量互为因果等)。解决方案:对症下药,选用高级模型。 1. 理论问题。还有其他重要因素未加考察,或者有干扰因素造成混淆(confounding variable)。解决方案:改进理论,澄清作用机制。