2D图的置信区域为1sigma

时间:2014-09-23 11:33:54

标签: python matplotlib confidence-interval

我使用matplotlib分散函数绘制了两个变量。 enter image description here

I would like to show the 68% confidence region by highlighting it in the plot. 我知道要在直方图中显示它,但我不知道如何为这样的2D图表(x vs y)执行此操作。就我而言,x is Massy is Ngal Mstar+2

我正在寻找的示例图片如下所示:

在这里,他们使用浅蓝色显示使用深蓝色和95%置信区域的68%置信区域。

是否可以使用其中一个 scipy.stats模块实现?

enter image description here

2 个答案:

答案 0 :(得分:4)

要绘制两条曲线之间的区域,可以使用pyplot.fill_between()

至于你的置信区域,我不确定你想要达到什么目标,所以我通过修改代码来同时使用置信带进行例证:

https://en.wikipedia.org/wiki/Confidence_and_prediction_bands#cite_note-2

import numpy as np
import matplotlib.pyplot as plt
import scipy.special as sp

## Sample size.
n = 50

## Predictor values.
XV = np.random.uniform(low=-4, high=4, size=n)
XV.sort()

## Design matrix.
X = np.ones((n,2))
X[:,1] = XV

## True coefficients.
beta = np.array([0, 1.], dtype=np.float64)

## True response values.
EY = np.dot(X, beta)

## Observed response values.
Y = EY + np.random.normal(size=n)*np.sqrt(20)

## Get the coefficient estimates.
u,s,vt = np.linalg.svd(X,0)
v = np.transpose(vt)
bhat = np.dot(v, np.dot(np.transpose(u), Y)/s)

## The fitted values.
Yhat = np.dot(X, bhat)

## The MSE and RMSE.
MSE = ((Y-EY)**2).sum()/(n-X.shape[1])
s = np.sqrt(MSE)

## These multipliers are used in constructing the intervals.
XtX = np.dot(np.transpose(X), X)
V = [np.dot(X[i,:], np.linalg.solve(XtX, X[i,:])) for i in range(n)]
V = np.array(V)

## The F quantile used in constructing the Scheffe interval.
QF = sp.fdtri(X.shape[1], n-X.shape[1], 0.95)
QF_2 = sp.fdtri(X.shape[1], n-X.shape[1], 0.68)

## The lower and upper bounds of the Scheffe band.
D = s*np.sqrt(X.shape[1]*QF*V)
LB,UB = Yhat-D,Yhat+D
D_2 = s*np.sqrt(X.shape[1]*QF_2*V)
LB_2,UB_2 = Yhat-D_2,Yhat+D_2


## Make the plot.
plt.clf()
plt.plot(XV, Y, 'o', ms=3, color='grey')
plt.hold(True)
a = plt.plot(XV, EY, '-', color='black', zorder = 4)

plt.fill_between(XV, LB_2, UB_2, where = UB_2 >= LB_2, facecolor='blue', alpha= 0.3, zorder = 0)
b = plt.plot(XV, LB_2, '-', color='blue', zorder=1)
plt.plot(XV, UB_2, '-', color='blue', zorder=1)

plt.fill_between(XV, LB, UB, where = UB >= LB, facecolor='blue', alpha= 0.3, zorder = 2)
b = plt.plot(XV, LB, '-', color='blue', zorder=3)
plt.plot(XV, UB, '-', color='blue', zorder=3)

d = plt.plot(XV, Yhat, '-', color='red',zorder=4)

plt.ylim([-8,8])
plt.xlim([-4,4])

plt.xlabel("X")
plt.ylabel("Y")

plt.show()

输出如下: enter image description here

答案 1 :(得分:0)

首先谢谢你@snake_charmer 以获得答案,但我找到了一种更简单的方法来解决问题,使用来自{{1}的 curve_fit }

我使用scipy.optimize拟合我的数据样本,这给了我最合适的参数。它给我的是参数的估计协方差。其对角线提供参数估计的方差。要计算参数的一个标准偏差,我们可以使用curve_fit,其中np.sqrt(np.diag(pcov))是协方差矩阵。

pcov

以上是我用于数据的拟合函数。

现在使用def fitfunc(M,p1,p2): N = p1+( (M)*p2 ) return N

来拟合数据
curve_fit

popt_1,pcov_1 = curve_fit(fitfunc,logx,logn,p0=(10.0,1.0),maxfev=2000) p1_1 = popt_1[0] p1_2 = popt_1[1] sigma1 = [np.sqrt(pcov_1[0,0]),np.sqrt(pcov_1[1,1])] #THE 1 SIGMA CONFIDENCE INTERVALS residuals1 = (logy) - fitfunc((logx),p1_1,p1_2) xi_sq_1 = sum(residuals1**2) #THE CHI-SQUARE OF THE FIT curve_y_1 = fitfunc((logx),p1_1,p1_2) fig = plt.figure() ax1 = fig.add_subplot(111) ax1.scatter(logx,logy,c='r',label='$0.0<z<0.5$') ax1.plot(logx,curve_y_1,'y') ax1.plot(logx,fitfunc(logx,p1_1+sigma1[0],p1_2+sigma1[1]),'m',label='68% conf limits') ax1.plot(logx,fitfunc(logx,p1_1-sigma1[0],p1_2-sigma1[1]),'m')

enter image description here