在Python中绘制回归线、置信区间和预测区间

在Python中绘制回归线、置信区间和预测区间,python,matplotlib,statistics,regression,seaborn,Python,Matplotlib,Statistics,Regression,Seaborn,我不熟悉回归游戏,希望为满足特定条件(即平均复制值超过阈值;见下文)的数据子集绘制一条功能任意的非线性回归线(加上置信度和预测区间) 为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.

我不熟悉回归游戏,希望为满足特定条件(即平均复制值超过阈值;见下文)的数据子集绘制一条功能任意的非线性回归线(加上置信度和预测区间)

为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散点图配合使用。

好的,这里有一个例子(尽管没有预测带)。首先,您要选择适用的数据:

threshold = 0.02
reg_x = np.log10(x)[data.mean(1)>threshold]
reg_y = data.mean(1)[data.mean(1)>threshold]
然后选择一个模型并进行拟合。注意,这里我选择了一个二阶多项式,但原则上你可以做任何事情。对于我使用的fits
kapteyn
,这有一个内置的置信限方法,尽管它很容易实现(参见示例)

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\u 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.

你有回归模型吗?”“非线性”可能很多。@rammelmuller不,我只是尝试曲线拟合并显示数据的总体趋势。到目前为止,我在
scipy.optimize
下测试过的最佳模型是
a*np.log2(c+x)+b
,但它仍然不能很好地捕捉饱和部分。啊哈。。我猜预测一个总体趋势将是,虽然有一些合理的确定性,因为不同随机集之间的变化似乎相当大-一旦二阶多项式可以完成这项工作,有时其他一些函数会得分更好。。有了足够的参数,你真的可以做任何事情。我应该指定,我主要想要绘制最后13个数据点(红点)的平均值的总体趋势。在这种情况下,不同随机集之间的变化会影响平均值的置信区间吗?我想这取决于模型的好坏。
p_upper, p_lower = prediction_band(*args, **kwargs)
plt.fill_between(reg_x, p_upper, p_lower, facecolor='blue', alpha=0.2, linestyle='')