Py学习  »  Python

HF.065 | 绘制置信带:R、Python和Matlab都全了!

Hydro90 • 1 年前 • 222 次点击  


置信区间(confidence interval),或称为置信带分位数区间等,是指由样本统计量所构造成的总体参数的估计区间。置信区间展现的是某一参数或估计量的真实值有某一概率落在测量结果的周围的程度。

在水文频率分析计算当中,计算置信区间并以条带状图像表示计算结果,能够最为直观的展现计算结果的可信范围。为方便大家绘制,小编在此汇总了主流数据分析语言R、Python和Matlab的置信区间绘制核心方法。


01

R绘制置信带


R语言绘制过程中需注意目标估计函数的内置函数是否有分位数计算函数,否则需使用quantile()函数计算相关分位数值。下面以R语言中GAMLSS内置Gamma分布分位数计算函数qGA()为例介绍绘图方法。

Quantile_GA function (obj, data,y){  Q_list = NULL  Q_list 0.05,mu = obj$mu.fv, sigma = obj$sigma.fv),                  qGA(0.25,mu = obj$mu.fv, sigma = obj$sigma.fv),                  qGA(0.5,mu = obj$mu.fv, sigma = obj$sigma.fv),                  qGA(0.75,mu = obj$mu.fv, sigma = obj$sigma.fv),                  qGA(0.95,mu = obj$mu.fv, sigma = obj$sigma.fv))  colnames(Q_list) "5%","25%","50%","75%","95")  Q_list 
根据需求(设定分位点、均值、方差等)依次计算所需分位点函数值,构建数据向量空间。
pp<-ggplot()+    geom_ribbon(aes(ymin = Q_list[,1],ymax = Q_list[,2], x = index),fill = 'lightskyblue'alpha =0.3)+    geom_ribbon(aes(ymin = Q_list[,2],ymax = Q_list[,4], x = index),fill = 'lightskyblue1'alpha =0.8)+    geom_ribbon(aes(ymin = Q_list[,4],ymax = Q_list[,5], x = index),fill = 'lightskyblue1'alpha =0.3)+    geom_line(aes(x = index, y =  Q_list[,3]), col = "gray40"alpha = 0.6)+    geom_point(aes(x = index, y =  data[,y]), col = "gray26",alpha=0.5)+    labs(x = "  ",  y = "  ") +    theme(plot.title = element_text(hjust = 0.5,size = 20,family = "RMN"),          


    
axis.text = element_text(size = 20,family = "RMN"),          text = element_text(size = 20,family = "RMN"))  return(pp)}
geom_ribbon()可以绘制带状曲线,需要分别设定上下限。此处将计算的向量按需依次代入计算即可。根据图像所需,使用theme()图像主题背景设置函数调整字号、颜色、坐标轴等要素。
Source:  



http://doi.org/10.19797/j.cnki.1000-0852.20220175







02

Python绘制置信带


水文图绘HF.054中我们曾介绍过python绘制置信带的关键代码,使用fill_between函数,提供上下估计误差,即可实现置信带绘制。

ax3 = plt.gca()rate = np.array([0, 0.25, 0.5, 0.75, 1, 1.5, 2])plotK(16.094376 * rate, invert=True)plt.fill_between(Resp_dict['yrs'], Resp_dict['p17'], Resp_dict['p83'],                  alpha=alpha, facecolor='royalblue', label='likely range')plt.plot(Resp_dict['yrs'], Resp_dict['p50'], color='k', linewidth=LW, linestyle=':',          label='Central estimate (ECS)')plt.plot(Resp_dict['yrs'], Resp_dict['p50_0.5_pattern'], color='grey', linewidth=LW, linestyle=':',          label='Pattern effect -0.5 W m$^{-2}$ C$^{-1}$')plt.xlim(xmin, xmax)plt.ylim(-ymax, -ymin)ax3.yaxis.set_ticks_position('right')ax3.tick_params(width=0.5)plt.title('c) Integrated Radiative Response')plt.legend(loc='lower left', frameon=False, fontsize=fontsize)


03

Matlab绘制置信带


在Matlab中绘制置信带有两种方式,一种是根据目标拟合函数计算置信区间后进行图像带填充;另一种是采用拟合函数内置分位数值计算函数进行绘图。下面转自好玩的Matlab推文中的相关示例。需要注意的是,示例二中采用最小二乘法拟合函数polyfit()进行线性拟合,读者在应用时需根据目标拟合函数(不一定是最小二乘法)进行调整。


示例一:

clc;clear;close all;%--------------------------------------------------------------------------% @Author: 好玩的Matlab% @公众号:好玩的Matlab% @Created: 09,06,2023% @Email:2377389590@qq.com%--------------------------------------------------------------------------% 使用提供的数据data = repmat([2 2], 200, 1) + randn(200, 2) * [1 .5; 0 1.32];xData = data(:, 1);yData = data(:, 2);% 绘制散点图figure('Position',[383 355 886 507]);scatter(xData, yData, 'r', 'filled', 'MarkerEdgeColor', 'none', 'MarkerFaceAlpha', 0.4);hold on;% 进行线性回归linearModel = fitlm(xData, yData);% 计算回归曲线和置信区间xFit = linspace(min(xData), max(xData), 200)';[yPred, yConfInterval] = predict(linearModel, xFit, 'Alpha', 0.05); % 95%置信区间% 绘制回归曲线plot(xFit, yPred, 'r', 'LineWidth', 2);% 使用fill函数绘制置信区间fill([xFit; flipud(xFit)], [yConfInterval(:, 1); flipud(yConfInterval(:, 2))], 'g', 'FaceAlpha', 0.3, 'EdgeColor', 'none');defaultAxeslegend(gca, 'Data', 'Regression Line','95%','Confidence Interval','box','on','Location','best','EdgeColor', [1 1 1]*0.8);
例二:
clc;clear;close all;%--------------------------------------------------------------------------% @Author: 好玩的Matlab% @公众号:好玩的Matlab% @Created: 09


    
,06,2023% @Email:2377389590@qq.com%--------------------------------------------------------------------------% 使用提供的数据data = repmat([2 2], 200, 1) + randn(200, 2) * [1 .5; 0 1.32];xData = data(:, 1);yData = data(:, 2);% 创建图形窗口并持有当前图figure('Position',[383 355 886 507]);hold on;% 使用polyfit进行线性拟合[polyCoeff, polyStruct] = polyfit(xData, yData, 1);xFit = linspace(min(xData), max(xData), 200);[yFit, fitDelta] = polyval(polyCoeff, xFit, polyStruct);alpha = 0.05;  % 对于95%置信区间zValue = norminv(1 - alpha/2, 0, 1);  % 这将返回1.960% 计算置信区间upperConfInt = yFit + zValue .* fitDelta;lowerConfInt = yFit - zValue .* fitDelta;% 绘制原始数据scatter(xData, yData, 'r', 'filled', 'MarkerEdgeColor', 'none', 'MarkerFaceAlpha', 0.4);% 绘制拟合曲线plot(xFit, yFit, 'r', 'LineWidth', 2.5);% 使用fill函数绘制置信区间fill([xFit, fliplr(xFit)], [upperConfInt, fliplr(lowerConfInt)], 'g', 'EdgeColor', 'none', 'FaceAlpha', 0.15);defaultAxeslegend(gca, 'Data', 'Regression Line','95%','Confidence Interval','box','on','Location','best','EdgeColor', [1 1 1]*0.8);

      更多详细内容可点击进入好玩的Matlab推送原文深入阅读。


一图胜千言!水文图绘改版后致力于分享水文相关的精美图表,为读者提供作图思路和经验,帮助大家制作更漂亮丰富的图表。同时欢迎留言咨询绘图难点,我们会针对性地分享相关绘制经验。另外也期待读者踊跃来稿,分享更好的构图思维和技巧,稿件可发送至邮箱hydro90@126.com, 或者联系微信17339888901投稿。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/161725
 
222 次点击