全部版块 我的主页
论坛 计量经济学与统计论坛 五区 数据交流中心 数据求助
247 0
2025-08-23
多层次模型(Hierarchical/Multilevel Model)适用于处理具有嵌套结构的数据(如学生嵌套于班级、员工嵌套于公司等)。以下是使用R语言和Python实现多层次模型的代码示例,分别针对连续型结果变量(线性模型)和分类结果变量(逻辑回归模型)。


一、R语言实现(使用`lme4`包)
`lme4`是R中最常用的多层次模型包,支持线性和广义线性多层次模型。

1. 线性多层次模型(连续结果变量)
```r
安装并加载必要的包
install.packages(c("lme4", "lmerTest"))
library(lme4)
library(lmerTest)   用于计算p值

示例数据:学生成绩数据(学生嵌套于班级)
数据包含:成绩(score)、学生努力程度(effort)、班级规模(class_size)、班级ID(class)
set.seed(123)
n_class <- 50   50个班级
n_student <- 30   每个班级30名学生
class_id <- rep(1:n_class, each = n_student)
class_size <- rnorm(n_class, mean = 40, sd = 5)[class_id]   班级层面变量
effort <- rnorm(n_class * n_student, mean = 50, sd = 10)   学生层面变量
score <- 20 + 0.5*effort - 0.3*class_size + rnorm(n_class * n_student, 0, 5)   生成成绩
data <- data.frame(score, effort, class_size, class = factor(class_id))

构建多层次模型:
第一层(学生):score ~ effort
第二层(班级):截距和effort的斜率随班级变化,控制class_size
model <- lmer(
  score ~ effort + class_size + (1 + effort | class),   (1 + effort | class)表示班级层面的随机截距和随机斜率
  data = data
)

查看结果
summary(model)
固定效应:effort和class_size的系数
随机效应:班级间截距和斜率的变异(方差-协方差矩阵)
```

2. 逻辑斯蒂多层次模型(二分类结果变量)
```r
生成二分类结果变量(是否及格:1=及格,0=不及格)
data$pass <- ifelse(score > 60, 1, 0)

构建多层次逻辑回归模型
model_logit <- glmer(
  pass ~ effort + class_size + (1 + effort | class),   随机截距和随机斜率
  family = binomial(link = "logit"),   指定逻辑斯蒂分布
  data = data
)

查看结果
summary(model_logit)
固定效应需通过exp(系数)转换为优势比(OR)
exp(fixef(model_logit))   优势比
```


二、Python实现(使用`statsmodels`)
`statsmodels`支持线性混合效应模型,以下是示例代码。

1. 线性多层次模型
```python
import pandas as pd
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf

生成示例数据(同R的学生成绩数据)
np.random.seed(123)
n_class = 50
n_student = 30
class_id = np.repeat(range(n_class), n_student)
class_size = np.random.normal(40, 5, n_class)[class_id]
effort = np.random.normal(50, 10, n_class * n_student)
score = 20 + 0.5*effort - 0.3*class_size + np.random.normal(0, 5, n_class * n_student)
data = pd.DataFrame({
    'score': score,
    'effort': effort,
    'class_size': class_size,
    'class': class_id
})

构建多层次模型:随机截距和随机斜率
model = smf.mixedlm(
    formula='score ~ effort + class_size',   固定效应部分
    data=data,
    groups=data['class'],   分组变量(班级)
    re_formula='~effort'   随机效应部分(包含截距1和effort的斜率)
)
result = model.fit()

查看结果
print(result.summary())
固定效应:effort和class_size的系数
随机效应:班级间的方差和协方差
```

2. 逻辑斯蒂多层次模型(二分类结果)
```python
生成二分类结果变量
data['pass'] = (data['score'] > 60).astype(int)

构建多层次逻辑回归模型
model_logit = smf.mixed_glm(
    formula='pass ~ effort + class_size',
    data=data,
    groups=data['class'],
    family=sm.families.Binomial(link=sm.families.links.logit()),   逻辑斯蒂分布
    re_formula='~effort'   随机效应
)
result_logit = model_logit.fit()

查看结果
print(result_logit.summary())
固定效应的优势比
print(np.exp(result_logit.fe_params))   转换为优势比
```


三、模型解释与关键参数
1. 固定效应(Fixed Effects):  
   如`effort`和`class_size`的系数,表示变量对结果的平均影响(跨所有组的共同效应)。

2. 随机效应(Random Effects):  
   - 随机截距:`(1 | class)`表示不同班级的基础水平(截距)存在差异。  
   - 随机斜率:`(1 + effort | class)`表示`effort`对`score`的影响强度在不同班级中存在差异(斜率变异)。  

3. 方差成分:  
   随机效应的方差表示组间差异的大小,例如班级间截距的方差越大,说明班级对结果的影响越显著。


四、扩展与注意事项
- 更高层次模型:可通过增加分组变量扩展到三层模型(如学生→班级→学校),例如`(1 | school/class)`。  
- 模型选择:使用AIC/BIC比较不同模型(如仅随机截距vs随机截距+随机斜率)。  
- 数据要求:多层次模型对样本量(尤其是组数)较敏感,建议每组至少包含5-10个观测值。  

以上代码可根据实际数据结构(如嵌套层次、变量类型)进行调整,核心是通过`(随机效应 | 分组变量)`指定多层次结构。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群