2016-09-30 23 views
1

我绘制在MatLab的线图与标准偏差使用对数标度的负值处理:用对数尺度

fig = figure; 
errorbar(mean(samples),sqrt(var(samples))); 
ax = get(fig,'CurrentAxes'); 
set(ax,'YScale','log'); 

然而,在一些样品中,下误差棒是低于0。例如,给出样品s=[11.0147 80.2365 11.6116 11.1837 9.9091],然后mean=24.7911std=31.0013,这使得较低的误差棒在-6.2101。由于对数刻度忽略负值,所以误差棒看起来很奇怪。

如何计算不对称误差线?我虽然也许计算std所有值>=mean和所有值<=mean,以便我有不同的上限和下限误差条。这是一种有效的方法吗?

+1

真正的问题是你为什么要用对数标度来绘制可能为负数的东西?如果所有的样本都保证是正的,那么你真的不应该这样绘制误差线,就好像底层分布是高斯一样。 (这是假设你是通过绘制误差线1平均值的任一侧的标准偏差得出的)。根据四分位数/范围,您可能会更好地考虑误差线。当然,如果数值*可能*为负数,那么您也可能得到负数均值,在这种情况下,您根本不应该使用对数刻度! – Dave

+0

所有值都是正值,但在线性范围内看起来不太好。他们从大约100个样本中的1e5到1e-1,然后在700个样本中进行1e-5。它使图表很混乱,因为其中还有两个图。 – BlueMoon93

+1

行 - 你绝对不想使用“高斯”意义上的误差线,因为你的底层概率分布不是对称的。所以,除非你知道(或可以确定)概率分布,那么你应该根据某种形式的四分位数来制作你的误差线。例如,您可以使用5%和95%的分数(低于误差线的样本的5%,高于误差线的5%)。这意味着它们的大小不相等,但这更好地反映了您的数据。不要试图使用标准差,因为它只适用于高斯分布。 – Dave

回答

1

为了生成5%和95%的误差线,最简单的事情就是对基础数据进行排序。因此,假设您有一组与特定参数相对应的样本,并且它们记录在矩阵样本中,其中一行代表参数x的一个值的实验值。然后这段代码会很容易给你上限和下限值:

ascending=sort(samples,2); 
lower_error_bar=ascending(:,round(size(ascending,2)*0.05)); 
mean=mean(samples,2); 
median=ascending(:,round(size(ascending,2)*0.5)); 
upper_error_bar=ascending(:,round(size(ascending,2)*0.95)); 

我希望这有助于!