带置信区间的拟合线几种绘制方式-在python和R中的实现 (二)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带置信区间的拟合线几种绘制方式-在python和R中的实现 (二)相关的知识,希望对你有一定的参考价值。

参考技术A 在(一)中展示了基于python的带置信区间的拟合性,同时拟合多条直线,本文主要讲下在R中如何去实现。
首先我们将数据集转变为长数据格式,长格式就是每种类型结束后接着接另一个变量的值,并在另一列中加上该值的类型,格式如下:

读者在进行运用的时候,只需要更改下目录即将setwd("D:/qixiang/final")变为自己的数据存放路径,data1 type, levels=c('PPT','ET','FWS','RWCN','RWCC','IWCC')) 部分改为自己的变量顺序。p4<-p2+ylab("water component(mm)")+xlab("year") #设置y轴和x轴的名称中改成自己的y轴和x轴名称,p12<-p11+labs(title="Songhua River Basin")中改成自己的标题名称。在想得到图像时,在命令框中输入p12或p13,点击回车即可,见下图

p13中增加了线条而p12中没有增加线条,根据需要自己取舍。建议设置好后通过R运行一遍,在R中将结果保存为pdf,然后通过ps调整分辨率即可。
需要数据来进行操作的读者,可以发邮件到 yinlichang3064@163.com ,看到后会尽快发过去

更多需求,请查看个人介绍

绘制重复条目的置信区间和预测区间

【中文标题】绘制重复条目的置信区间和预测区间【英文标题】:Plotting confidence and prediction intervals with repeated entries 【发布时间】:2016-05-02 03:02:25 【问题描述】:

我有两个变量的相关图,x 轴上的预测变量(温度)和 y 轴上的响应变量(密度)。我的最佳拟合最小二乘回归线是二阶多项式。我还想绘制置信区间和预测区间。 this 答案中描述的方法似乎很完美。但是,我的数据集 (n=2340) 有许多 (x,y) 对的重复条目。我得到的情节如下所示:

这是我的相关代码(根据上面的链接答案稍作修改):

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。 但是,我需要 single 线来表示多项式最佳拟合线,以及置信区间和预测区间(而不是我目前在我的图中拥有的多条线)。有什么想法吗?

更新:@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')

这达到了预期的结果:

【问题讨论】:

***.com/a/63560689/10375049 【参考方案1】:

您需要根据温度对预测值进行排序。我认为*

所以要获得漂亮的曲线,您必须使用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 pieces
y = exec(strPolynomialFromArray(numpy.polynomial.polynomial.polyfit(xs,ys,degree)))
plt.plot(x , y)

您可以更多地研究绘制平滑线here 只需记住所有线都是线性样条,因为连续曲率是不合理的。

我相信多项式拟合是通过最小二乘拟合完成的(过程described here)

祝你好运!

【讨论】:

你可能想看看这个关于插值的帖子:docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html 我想避免修改原始数据(使用平均密度或插值)。应该可以仅使用数据创建最佳拟合线和置信/预测区间。 ...如果我能以某种方式从我的第一个示例(我在上面发布的第一个图)中提取所有多条迹线 - 并将它们平均。那可能会得到我需要的东西。 我想我误解了你原来的答案。我根据温度重新排列了我的预测区间和置信区间,并将它们绘制为连续线。 (没有使用你的 strPolynomialFromArray 函数)。我将编辑我的帖子以显示正确的输出。采纳答案,谢谢!

以上是关于带置信区间的拟合线几种绘制方式-在python和R中的实现 (二)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 获得 Weibull 分布的置信区间?

如何计算 R 中线性回归模型中斜率的 95% 置信区间

绘制 lm 对象的 95% 置信区间

R语言使用gls函数拟合模型并可视化模型的预测值及其置信区间实战

绘制重复条目的置信区间和预测区间

数据可视化应用绘制拟合区间统计图表(附Python和R语言代码)