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

如何在Python中执行强制固定梯度的线性回归并获取统计量?

固定斜率为1的线性回归实现方案

你不需要手动计算所有统计量,现有工具包完全可以实现,且不需要贝叶斯方法(因为斜率是严格固定的确定值,频率派方法足够)。以下是具体实现思路和工具包用法:

核心原理

固定斜率为1时,回归模型为:y = x + b,等价于求解残差项 z = y - x 的均值——最小二乘意义下,最优截距b就是z的算术平均值。

具体实现方式

1. 手动快速计算(适合简单场景)

直接通过numpy计算核心参数,统计量也可推导得到:

import numpy as np

# 生成示例数据
n = 20
x = np.random.uniform(10, 20, n)
y = x - np.random.normal(1, 1, n)

# 计算固定斜率的截距
z = y - x
b = np.mean(z)

# 计算统计量:截距的标准误差
se_b = np.std(z, ddof=1) / np.sqrt(n)
# 计算R²值
residuals = y - (x + b)
ss_res = np.sum(residuals**2)
ss_tot = np.sum((y - np.mean(y))**2)
r_squared = 1 - (ss_res / ss_tot)

2. 使用statsmodels获取完整统计结果

statsmodels支持通过offset参数固定斜率,直接输出截距的p值、标准误等专业统计量:

import statsmodels.api as sm

# 构造模型:offset(x)等价于强制斜率为1的x项
model = sm.OLS(y, sm.add_constant(np.ones_like(x)), offset=x)
results = model.fit()

# 打印完整统计报告
print(results.summary())
# 提取截距b
b = results.params[0]

3. 使用scipy.optimize拟合并获取置信区间

通过自定义固定斜率的函数,用curve_fit拟合并得到参数的置信区间:

from scipy.optimize import curve_fit

def fixed_slope_model(x, b):
    return x + b

# 拟合参数
popt, pcov = curve_fit(fixed_slope_model, x, y)
b = popt[0]
# 计算截距的95%置信区间
b_ci = np.array([popt[0] - 1.96*np.sqrt(pcov[0,0]), popt[0] + 1.96*np.sqrt(pcov[0,0])])

4. scikit-learn框架下的实现

sklearn没有直接固定斜率的参数,但可以通过数据变换实现:

from sklearn.linear_model import LinearRegression

# 变换目标变量:z = y - x
z = y - x
# 构造全1的特征矩阵,拟合z ~ 1(即求均值)
X = np.ones((len(z), 1))
model = LinearRegression(fit_intercept=False)
model.fit(X, z)
b = model.coef_[0]

示例可视化(修改后)

将固定斜率的拟合结果加入你的示例代码:

import numpy as np
import matplotlib.pyplot as plt

n = 20
x = np.random.uniform(10, 20, n)
y = x - np.random.normal(1, 1, n)

plt.scatter(x, y, ec="k", label="实测数据")

true_x = np.array((8, 20))
plt.plot(true_x, true_x, "k--", label="1:1基准线")

# 固定斜率为1的拟合线
b = np.mean(y - x)
plt.plot(true_x, true_x + b, "r:", label="固定斜率拟合线")

# 普通线性回归
m, c = np.polyfit(x, y, 1)
plt.plot(true_x, true_x*m + c, "g:", label="普通线性回归线")

plt.xlabel("理论值")
plt.ylabel("实测值")
plt.legend()
plt.show()

(图注:图中展示了离散的实测数据点、黑色虚线的1:1基准线、红色点线的固定斜率拟合线、绿色点线的普通线性回归线,直观对比了两种回归方式的差异)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:13:59