首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用重复条目绘制置信度和预测区间

用重复条目绘制置信度和预测区间
EN

Stack Overflow用户
提问于 2016-01-25 17:40:07
回答 1查看 6.4K关注 0票数 7

我有两个变量的相关图,x轴上的预测变量(温度)和y轴上的响应变量(密度)。我的最佳拟合最小二乘回归线是一个二阶多项式。我也想画出信心和预测的间隔。答案中描述的方法似乎是完美的。然而,我的数据集(n=2340)对于许多(x,y)对都有重复的条目。我由此得出的情节如下:

下面是我的相关代码(从上面的链接答案中略作修改):

代码语言:javascript
运行
复制
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.sandbox.regression.predstd import wls_prediction_std
import statsmodels.formula.api as smf    
from statsmodels.stats.outliers_influence import summary_table

d = {'temp': x, 'dens': y}
df = pd.DataFrame(data=d)

x = df.temp
y = df.dens

plt.figure(figsize=(6 * 1.618, 6))
plt.scatter(x,y, s=10, alpha=0.3)
plt.xlabel('temp')
plt.ylabel('density')

# points linearly spaced for predictor variable
x1 = pd.DataFrame({'temp': np.linspace(df.temp.min(), df.temp.max(), 100)})

# 2nd order polynomial
poly_2 = smf.ols(formula='dens ~ 1 + temp + I(temp ** 2.0)',   data=df).fit()

# this correctly plots my single 2nd-order poly best-fit line:
plt.plot(x1.temp, poly_2.predict(x1), 'g-', label='Poly n=2  $R^2$=%.2f' % poly_2.rsquared, 
     alpha=0.9)

prstd, iv_l, iv_u = wls_prediction_std(poly_2)

st, data, ss2 = summary_table(poly_2, alpha=0.05)

fittedvalues = data[:,2]
predict_mean_se  = data[:,3]
predict_mean_ci_low, predict_mean_ci_upp = data[:,4:6].T
predict_ci_low, predict_ci_upp = data[:,6:8].T

# check we got the right things
print np.max(np.abs(poly_2.fittedvalues - fittedvalues))
print np.max(np.abs(iv_l - predict_ci_low))
print np.max(np.abs(iv_u - predict_ci_upp))

plt.plot(x, y, 'o')
plt.plot(x, fittedvalues, '-', lw=2)
plt.plot(x, predict_ci_low, 'r--', lw=2)
plt.plot(x, predict_ci_upp, 'r--', lw=2)
plt.plot(x, predict_mean_ci_low, 'r--', lw=2)
plt.plot(x, predict_mean_ci_upp, 'r--', lw=2)

打印语句按预期计算为0.0。但是,我需要多项式最佳拟合线的单行,以及置信度和预测间隔(而不是我目前在绘图中的多条线)。有什么想法吗?

Update:在@kpie的第一个答案之后,我根据温度排序了我的信任和预测间隔数组:

代码语言:javascript
运行
复制
data_intervals = {'temp': x, 'predict_low': predict_ci_low, 'predict_upp': predict_ci_upp, 'conf_low': predict_mean_ci_low, 'conf_high': predict_mean_ci_upp}

df_intervals = pd.DataFrame(data=data_intervals)

df_intervals_sort = df_intervals.sort(columns='temp')

这取得了预期的成果:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-25 18:24:34

你需要根据温度来排序你的预测值。我想*

因此,要获得良好的曲线,您必须使用numpy.polynomial.polynomial.polyfit,这将返回一个系数的列表。您将不得不将x和y数据拆分为2个列表,以便它适合于函数。

然后,您可以用以下方法绘制此函数:

代码语言:javascript
运行
复制
def strPolynomialFromArray(coeffs):
    return("".join([str(k)+"*x**"+str(n)+"+" for n,k in enumerate(coeffs)])[0:-1])

from numpy import *
from matplotlib.pyplot import *
x = linespace(-15,45,300) # your smooth line will be made of 300 smooth pieces
y = exec(strPolynomialFromArray(numpy.polynomial.polynomial.polyfit(xs,ys,degree)))
plt.plot(x , y)

您可以查看更多的绘制光滑线这里只记得所有的线都是线性样条,因为连续曲率是不合理的。

我相信多项式拟合是用最小二乘拟合(process 在此描述)完成的。

祝好运!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34998772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档