这是我的相关代码(从上面的链接答案略微修改):
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom statsmodels.sandBox.regression.predstd import wls_prediction_stdimport statsmodels.formula.API as smf from statsmodels.stats.outlIErs_influence import summary_tabled = {'temp': x,'dens': y}df = pd.DataFrame(data=d)x = df.tempy = df.densplt.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 variablex1 = pd.DataFrame({'temp': np.linspace(df.temp.min(),df.temp.max(),100)})# 2nd order polynomialpoly_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].Tpredict_ci_low,predict_ci_upp = data[:,6:8].T# check we got the right thingsprint 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,'o')plt.plot(x,fittedvalues,'-',lw=2)plt.plot(x,predict_ci_low,'r--',predict_ci_upp,predict_mean_ci_low,predict_mean_ci_upp,lw=2)
正如预期的那样,print语句的计算结果为0.0.
但是,我需要单线用于多项式最佳拟合线,以及置信度和预测间隔(而不是我目前在我的图中具有的多条线).有任何想法吗?
更新:
根据@kpIE的第一个回答,我根据温度命令了我的置信度和预测间隔数组:
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')
这取得了预期的结果:
因此,为了得到漂亮的曲线,你将不得不使用numpy.polynomial.polynomial.polyfit这将返回一个系数列表.您必须将x和y数据拆分为2个列表,以便它适合函数.
然后,您可以使用以下方式绘制此函
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 pIEcesy = exec(strpolynomialFromArray(numpy.polynomial.polynomial.polyfit(xs,ys,degree)))plt.plot(x,y)
您可以更多地考虑绘制平滑线条here,只记得所有线条都是线性样条曲线,因为连续曲率是不合理的.
我相信多项式拟合是用最小二乘拟合完成的(过程described here)
祝好运!
总结以上是内存溢出为你收集整理的python – 用重复的条目绘制置信度和预测间隔全部内容,希望文章能够帮你解决python – 用重复的条目绘制置信度和预测间隔所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)