statsmodels中拟合无截距多元线性回归后,能否模拟预测值分布?
用statsmodels GLM拟合无截距多元线性回归并模拟预测值分布
完全可以做到,下面是具体的实现步骤和示例:
1. 拟合无截距的GLM线性回归模型
多元线性回归本质是GLM的特例——使用高斯族(Gaussian)和恒等链接函数(identity link)。要去掉截距项,只需确保自变量矩阵不包含常数项,或者在公式接口中加入-1。
代码示例(矩阵接口)
import statsmodels.api as sm import numpy as np # 生成模拟数据(无截距设定) np.random.seed(42) x1 = np.random.normal(0, 1, 100) x2 = np.random.normal(0, 1, 100) y = 2*x1 + 3*x2 + np.random.normal(0, 0.5, 100) # 真实系数2、3,误差方差0.25 # 构造自变量矩阵(不含常数项) X = np.column_stack((x1, x2)) # 拟合GLM模型 model = sm.GLM(y, X, family=sm.families.Gaussian(link=sm.genmod.families.links.identity())) results = model.fit() print(results.summary())
公式接口写法
如果用Pandas DataFrame,可以通过公式去掉截距:
import pandas as pd data = pd.DataFrame({'y': y, 'x1': x1, 'x2': x2}) model = sm.GLM.from_formula('y ~ x1 + x2 -1', data=data, family=sm.families.Gaussian()) results = model.fit()
2. 模拟预测值的分布
预测值的分布由拟合均值和模型假设的误差分布共同决定。以高斯族为例,预测值 = 拟合均值 + 正态分布误差;如果是其他分布(如泊松、二项),则直接从对应分布中采样。
高斯族的模拟步骤
- 从拟合结果中提取系数
results.params和误差方差results.scale(即残差的估计方差) - 对目标输入
X_new计算拟合均值mu = X_new @ results.params - 从
N(0, sqrt(results.scale))中采样误差项,与均值相加得到模拟预测值 - 重复多次采样,得到完整的预测值分布
模拟代码示例
import matplotlib.pyplot as plt # 定义待预测的新输入样本 X_new = np.array([[1, 2], [0.5, -1]]) # 两个不同的输入组合 # 模拟10000次预测,生成分布 n_sim = 10000 pred_distributions = [] for x_sample in X_new: mu = x_sample @ results.params # 采样误差并生成预测值 errors = np.random.normal(0, np.sqrt(results.scale), n_sim) simulated_preds = mu + errors pred_distributions.append(simulated_preds) # 可视化第一个样本的预测分布 plt.hist(pred_distributions[0], bins=50, alpha=0.7, label='预测值分布 ([1,2])') plt.axvline(mu, color='red', linestyle='--', label='拟合均值') plt.xlabel('预测值') plt.ylabel('频次') plt.legend() plt.show()
注意事项
- 如果使用其他GLM族(如泊松、二项),模拟逻辑要对应调整:比如泊松族直接从
np.random.poisson(mu, n_sim)采样,无需加误差项 results.get_prediction()可以直接输出预测的置信/预测区间,但模拟分布能更直观展示整体的概率分布形态
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

