在 Python 中绘制回归线、置信区间和预测区间
Drawing regression line, confidence interval, and prediction interval in Python
我是回归游戏的新手,希望为满足特定条件(即平均复制值超过阈值)的数据子集绘制功能任意的非线性回归线(加上置信区间和预测区间) ; 见下文)。
data
是为跨 20 个不同值的自变量 x
生成的:x=(20-np.arange(20))**2
,每个条件重复 rep_num=10
。数据在 x
中显示出很强的非线性,如下所示:
import numpy as np
mu = [.40, .38, .39, .35, .37, .33, .34, .28, .11, .24,
.03, .07, .01, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
data = np.zeros((20, rep_num))
for i in range(13):
data[i] = np.clip(np.random.normal(loc=mu[i], scale=0.1, size=rep_num), 0., 1.)
我可以绘制数据的散点图;复制均值用红点表示:
import matplotlib.pyplot as plt
plt.scatter(np.log10(np.tile(x[:,None], rep_num)), data,
facecolors='none', edgecolors='k', alpha=0.25)
plt.plot(np.log10(x), data.mean(1), 'ro', alpha=0.8)
plt.plot(np.log10(x), np.repeat(0., 20), 'k--')
plt.xlim(-0.02, np.max(np.log10(x)) + 0.02)
plt.ylim(-0.01, 0.7)
我的目标是只为那些重复均值 > 0.02 的数据绘制回归线。此外,我想在回归周围添加一个 95% 的置信区间(黑色虚线),以及一个 95% 的预测区间(蓝色虚线)——理想情况下,预测区间也可以用透明蓝色着色背景.
最终图(预测区间内没有蓝色背景)看起来像这样:
我该怎么做?我的在线搜索使用 seaborn、scipy 和 statsmodels 产生了非常不同的部分方法。其中一些模板函数的应用似乎无法与现有的 matplotlib 散点图一起使用。
好的,这是一个镜头(虽然没有预测带)。首先你要select适用的数据:
threshold = 0.02
reg_x = np.log10(x)[data.mean(1)>threshold]
reg_y = data.mean(1)[data.mean(1)>threshold]
然后您选择一个模型并进行拟合。请注意,这里我选择了二阶多项式,但原则上你可以做任何事情。对于我使用的拟合 kapteyn
,它有一个内置的置信度禁止方法,尽管它很容易实现(参见 Delta method)
from kapteyn import kmpfit
# Set model to fit.
def model(p, x):
a, b, c = p
return a + b*x + c*x**2
# Perform fit.
f = kmpfit.simplefit(model, [.1, .1, .1], reg_x, reg_y)
f
包含所有估计参数等,您可以将其用于绘图等
x = np.linspace(0, 3, 100)
plt.plot(x, model(f.params, x), linestyle='-', color='black', marker='')
对于置信带,我们需要模型相对于参数的偏导数(是的,一些数学)。同样,这对于多项式模型来说很容易,对于任何其他模型也不应该成为问题。
# Partial derivatives:
dfdp = [1., reg_x, reg_x**2]
_, ci_upper, ci_lower = f.confidence_band(reg_x, dfdp, 0.95, model)
# Plot.
plt.plot(reg_x, ci_upper, linestyle='--', color='black', marker='')
plt.plot(reg_x, ci_lower, linestyle='--', color='black', marker='')
不幸的是,包中没有 prediction_bands()
例程,至少我不知道。假设您找到了预测带的一些方法,虽然绘图和准备看起来是一样的..
p_upper, p_lower = prediction_band(*args, **kwargs)
plt.fill_between(reg_x, p_upper, p_lower, facecolor='blue', alpha=0.2, linestyle='')
希望这对你有所帮助,L。
我是回归游戏的新手,希望为满足特定条件(即平均复制值超过阈值)的数据子集绘制功能任意的非线性回归线(加上置信区间和预测区间) ; 见下文)。
data
是为跨 20 个不同值的自变量 x
生成的:x=(20-np.arange(20))**2
,每个条件重复 rep_num=10
。数据在 x
中显示出很强的非线性,如下所示:
import numpy as np
mu = [.40, .38, .39, .35, .37, .33, .34, .28, .11, .24,
.03, .07, .01, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
data = np.zeros((20, rep_num))
for i in range(13):
data[i] = np.clip(np.random.normal(loc=mu[i], scale=0.1, size=rep_num), 0., 1.)
我可以绘制数据的散点图;复制均值用红点表示:
import matplotlib.pyplot as plt
plt.scatter(np.log10(np.tile(x[:,None], rep_num)), data,
facecolors='none', edgecolors='k', alpha=0.25)
plt.plot(np.log10(x), data.mean(1), 'ro', alpha=0.8)
plt.plot(np.log10(x), np.repeat(0., 20), 'k--')
plt.xlim(-0.02, np.max(np.log10(x)) + 0.02)
plt.ylim(-0.01, 0.7)
我的目标是只为那些重复均值 > 0.02 的数据绘制回归线。此外,我想在回归周围添加一个 95% 的置信区间(黑色虚线),以及一个 95% 的预测区间(蓝色虚线)——理想情况下,预测区间也可以用透明蓝色着色背景.
最终图(预测区间内没有蓝色背景)看起来像这样:
我该怎么做?我的在线搜索使用 seaborn、scipy 和 statsmodels 产生了非常不同的部分方法。其中一些模板函数的应用似乎无法与现有的 matplotlib 散点图一起使用。
好的,这是一个镜头(虽然没有预测带)。首先你要select适用的数据:
threshold = 0.02
reg_x = np.log10(x)[data.mean(1)>threshold]
reg_y = data.mean(1)[data.mean(1)>threshold]
然后您选择一个模型并进行拟合。请注意,这里我选择了二阶多项式,但原则上你可以做任何事情。对于我使用的拟合 kapteyn
,它有一个内置的置信度禁止方法,尽管它很容易实现(参见 Delta method)
from kapteyn import kmpfit
# Set model to fit.
def model(p, x):
a, b, c = p
return a + b*x + c*x**2
# Perform fit.
f = kmpfit.simplefit(model, [.1, .1, .1], reg_x, reg_y)
f
包含所有估计参数等,您可以将其用于绘图等
x = np.linspace(0, 3, 100)
plt.plot(x, model(f.params, x), linestyle='-', color='black', marker='')
对于置信带,我们需要模型相对于参数的偏导数(是的,一些数学)。同样,这对于多项式模型来说很容易,对于任何其他模型也不应该成为问题。
# Partial derivatives:
dfdp = [1., reg_x, reg_x**2]
_, ci_upper, ci_lower = f.confidence_band(reg_x, dfdp, 0.95, model)
# Plot.
plt.plot(reg_x, ci_upper, linestyle='--', color='black', marker='')
plt.plot(reg_x, ci_lower, linestyle='--', color='black', marker='')
不幸的是,包中没有 prediction_bands()
例程,至少我不知道。假设您找到了预测带的一些方法,虽然绘图和准备看起来是一样的..
p_upper, p_lower = prediction_band(*args, **kwargs)
plt.fill_between(reg_x, p_upper, p_lower, facecolor='blue', alpha=0.2, linestyle='')
希望这对你有所帮助,L。