You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python线性回归的P值计算中纳入误差棒信息?

带误差的线性回归P值检验方法(Python)

我关注Python中线性回归问题的统计验证,传统上可使用scipy的linregress函数解决。示例代码如下:

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import linregress

x = np.linspace(0,1,25)
y = 0.5*x + np.random.normal(0,0.15,len(x))
err = np.random.uniform(0.5,3.8,len(x))  # 修正uniform参数顺序,避免报错
plt.scatter(x,y)

无误差棒的拟合图:
无误差棒的拟合图
此时用linregress(x,y)计算得到pvalue=1.3e-8,拟合结果显著,与图表表现相符。

添加误差棒后的拟合图:
含误差棒的拟合图
考虑到误差规模,拟合显著的结论存疑。请问Python中是否有方法将误差大小信息纳入P值检验?


解决方案:加权最小二乘法(WLS)

当数据带有测量误差时,加权最小二乘法是合适的选择——它会根据每个数据点的误差大小分配权重(误差越小,权重越高),进而得到更合理的回归系数和统计检验结果。

方法1:使用statsmodels实现WLS

statsmodels库提供了完整的加权最小二乘法实现,能直接输出包含p值的统计结果:

import statsmodels.api as sm

# 构造自变量矩阵,加入截距项
X = sm.add_constant(x)
# 权重取误差平方的倒数(误差越小权重越大)
weights = 1 / (err ** 2)
# 拟合WLS模型
model = sm.WLS(y, X, weights=weights)
results = model.fit()
# 输出完整统计结果,包括系数的p值
print(results.summary())

输出结果中,P>|t|列就是对应系数的p值,加入误差权重后,回归系数的显著性会根据误差规模自动调整。

方法2:手动计算加权线性回归

如果不想依赖第三方库,也可以手动推导加权最小二乘法的公式:

import numpy as np
from scipy.stats import t

# 构造加权后的矩阵
w = np.diag(1 / err**2)
X = np.vstack([np.ones(len(x)), x]).T
# 计算加权回归系数
beta = np.linalg.inv(X.T @ w @ X) @ X.T @ w @ y
# 计算加权残差
residuals = y - X @ beta
# 估计方差
sigma_sq = (residuals.T @ w @ residuals) / (len(x)-2)
# 计算系数的标准差
se = np.sqrt(np.diag(sigma_sq * np.linalg.inv(X.T @ w @ X)))
# 计算t统计量和p值(自由度n-2)
t_stats = beta / se
p_values = 2 * (1 - t.cdf(np.abs(t_stats), df=len(x)-2))

print(f"截距项p值: {p_values[0]:.4e}")
print(f"斜率项p值: {p_values[1]:.4e}")

关键说明

  • 权重选择:通常取误差平方的倒数,这是假设误差服从正态分布时的最优权重,能让数据点的贡献与其精度成正比。
  • linregress的局限性:它是普通最小二乘法(OLS),默认所有数据点权重相同,完全忽略测量误差,因此当误差差异较大时,结果会失真。

内容的提问来源于stack exchange,提问作者user2944352

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 11:07:38