Python | 分层线性模型的实现及示例
分层线性模型(Hierarchical Linear Model,HLM)是一种统计模型,用于分析具有嵌套结构的数据。在这种数据中,个体观测值(如学生的成绩)可能受到它们所属的较高层次的群体(如班级、学校)的影响。
什么是分层线性模型?
分层线性模型(Hierarchical Linear Model,简称HLM),也被称为多层模型(Multilevel Model)或混合效应模型(Mixed-Effects Model),是一种统计模型,用于分析具有层次结构的数据。这种模型能够考虑到数据中的个体观测值可能受到它们所属的较高层次的群体的影响。
-
在真实世界的数据中,观测值通常嵌套在组中,将数据视为独立的可能会导致不准确的估计。
-
HLM通过整合层次结构来帮助纠正这一点,使其在分析教育、心理或医疗数据等复杂数据集时更加准确。
分层模型中的层次
在分层模型中,数据通常在两个或多个级别上结构化:
- 级别1(组内水平):表示组内的单个观察结果(例如,教室中的学生或部门中的雇员)。
- 级别2(组间级别):表示组或集群级别(例如,学校内的教室或公司内的部门)。
例如:在对学生表现的研究中,学生的个体特征(例如,考试成绩,出勤率)形成1级,而学校一级的特点(例如,位置、资源)形成2级。HLM可以同时分析学生层面和学校层面的因素。
分层模型的优势
-
处理嵌套数据:HLM有效地处理嵌套或分组数据,避免传统模型中出现的标准误差低估。
-
处理不平衡数据:与需要平衡数据的传统方法不同,HLM可以处理组内具有不同数量观测值的数据集。
-
考虑随机变化:HLM允许固定和随机效应,捕获层次结构中组内和组间的变化。
简单示例:学生成绩分析
假设我们有一组数据,记录了不同学校的学生的成绩。我们想要分析学生的成绩是否受到他们所在学校的影响。
数据结构
- 学生:个体观测值
- 班级:中间层次
- 学校:最高层次
每个学生的成绩可能受到他们所在班级和学校的影响。
假设
- 固定效应:所有学生的成绩都受到一个全局的、固定的预测变量(如学生的出勤率)的影响。
- 随机效应:
- 随机截距:每个学校的学生成绩基线可能不同。
- 随机斜率:不同学校的学生成绩对出勤率的响应可能不同。
模型表达式
其中:
- 学生成绩 i 是第 ( i ) 个学生的成绩。
- β0 是所有学校学生成绩的全局平均基线。
- β1 是出勤率对成绩的全局平均影响。
- u0j 是第 ( j ) 所学校的随机截距,表示该学校学生成绩的基线与全局平均基线的偏差。
- u1j 是第 ( j ) 所学校的随机斜率,表示该学校学生成绩对出勤率的响应与全局平均响应的偏差。
- εi 是误差项。
分析步骤
- 数据准备:收集每个学生的成绩和出勤率数据,以及他们所在的班级和学校信息。
- 模型构建:使用分层线性模型来分析数据,考虑固定效应(出勤率对成绩的影响)和随机效应(不同学校的成绩基线和对出勤率的响应)。
- 模型拟合:使用统计软件(如R、Python的
statsmodels
)来拟合模型。 - 结果解释:分析模型结果,了解不同学校的学生成绩基线和对出勤率的响应是否存在显著差异。
通过这个模型,我们可以更准确地估计出勤率对学生成绩的影响,同时考虑到不同学校可能存在的差异。这种方法有助于我们更好地理解教育政策和学校环境如何影响学生的学习成果。
在Python中实现分层线性模型
我们可以使用Python的statsmodels
库来拟合分层线性模型。下面是拟合两级分层模型的基本示例:
import pandas as pd
import statsmodels.formula.api as smf# Creating a sample dataset
data = pd.DataFrame({'outcome': [2.5, 3.0, 4.2, 3.7, 5.0, 2.8, 3.6, 4.0],'predictor1': [1, 2, 1, 2, 1, 2, 1, 2],'group': ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D']
})# Fitting a mixed effects model (HLM)
model = smf.mixedlm("outcome ~ predictor1", data, groups=data["group"])
result = model.fit()# Displaying the summary of the results
result.summary()
输出
Mixed Linear Model Regression Results
=======================================================
Model: MixedLM Dependent Variable: outcome
No. Observations: 8 Method: REML
No. Groups: 4 Scale: 0.102
Min. group size: 2 Log-Likelihood: -2.511
Max. group size: 2 Converged: Yes
Mean group size: 2
-------------------------------------------------------Coef. Std.Err. z P>|z| [0.025 0.975]
-------------------------------------------------------
Intercept 2.821 0.479 5.887 0.000 1.884 3.758
predictor1 0.226 0.286 0.790 0.430 -0.334 0.787
Group Var 0.025 0.035
=======================================================
添加固定和随机效应
在分层模型中,我们可以同时包含固定效应(各组间恒定)和随机效应(各组间变化)。以下是如何修改模型以包含两者:
# Adding random slopes for 'predictor1' across groups
model = smf.mixedlm("outcome ~ predictor1", data, groups=data["group"], re_formula="~predictor1")
result = model.fit()# Displaying the summary of the results
result.summary()
输出
Mixed Linear Model Regression Results
=======================================================
Model: MixedLM Dependent Variable: outcome
No. Observations: 8 Method: REML
No. Groups: 4 Scale: 0.048
Min. group size: 2 Log-Likelihood: -1.415
Max. group size: 2 Converged: Yes
Mean group size: 2
-------------------------------------------------------Coef. Std.Err. z P>|z| [0.025 0.975]
-------------------------------------------------------
Intercept 2.962 0.340 8.714 0.000 2.296 3.628
predictor1 0.188 0.204 0.922 0.357 -0.213 0.588
Group Var 0.000 0.000
predictor1 Var 0.048 0.059
=======================================================
分层线性模型的诊断和假设
一旦模型被拟合,检查模型是否符合其假设是至关重要的:
- 残差的正态性:残差应呈正态分布。这可以使用Q-Q图或残差直方图进行检查。
- 方差均衡:残差的方差在不同水平之间应保持恒定。
- 独立性:随机效应在各组之间应该是独立的。
残差分析示例:
import matplotlib.pyplot as plt# Plotting residuals
residuals = result.resid
plt.hist(residuals, bins=10)
plt.title("Residuals Histogram")
plt.xlabel("Residuals")
plt.ylabel("Frequency")
plt.show()
模型选择和比较
在实践中,您可以拟合多个层次模型以找到最佳拟合模型。选择过程涉及使用以下方法比较模型:
-
Akaike信息准则(AIC):AIC值越低,表示模型拟合越好。
-
贝叶斯信息准则(BIC):类似于AIC,但对其他参数的惩罚更大。
-
似然比检验:用于比较嵌套模型(其中一个模型是另一个模型的简单版本)。
模型比较示例:
# Fit two models: one with random intercepts, one with random slopes
model_1 = smf.mixedlm("outcome ~ predictor1", data, groups=data["group"])
result_1 = model_1.fit()model_2 = smf.mixedlm("outcome ~ predictor1", data, groups=data["group"], re_formula="~predictor1")
result_2 = model_2.fit()# Comparing models using AIC
print("Model 1 AIC:", result_1.aic)
print("Model 2 AIC:", result_2.aic)
输出
Model 1 AIC: 15.022
Model 2 AIC: 10.830
总结
分层线性模型是一种复杂的统计工具,用于研究具有嵌套性质的变量。利用固定效应和随机效应,我们可以使众多群体之间处于不同水平的关系描述该群体的方差。它回顾了分层模型的基础知识,通过统计模型在Python中进行了演示,并简要介绍了如何诊断和比较模型。