【问题标题】:How can you determine the height of a normal distribution fit in MATLAB from histfit如何从 histfit 确定 MATLAB 中正态分布拟合的高度
【发布时间】:2014-09-05 04:50:31
【问题描述】:

我使用 MATLAB 中的 histfit 函数生成了一个符合正态分布的直方图,并包含如下误差线:

h = histfit(data);
[nelements,bincenters] = hist(data);
hold on
err = sqrt(nelements);
errorbar( bincenters, nelements, err);
hold off

其中“data”是用于进行分布的 m 个数据点的向量,“dataerror”是每个点上的误差向量。源自histfit 的正态分布导致标准偏差可能与“dataerror”中的平均误差条不同。我想通过绘制一个单独的正态分布来直观地检查这种差异,该正态分布具有avg = mean(data); 的平均值和我的已知错误stdev = mean(dataerrors); 给出的标准偏差。我通过以下方式做到这一点:

  x = sort(data);
  y = exp(- 0.5 * ((x - avg) / stdev) .^ 2) / (stdev * sqrt(2 * pi));      
  plot(x, y,'k')

当我这样做时,平均值和标准差看起来很接近,但分布的高度不匹配,因为 histfit 分布没有标准化,但第二个分布是。我可以通过发明比例因子或y 点来进行临时校正,但我需要将其自动化,因此需要知道高度并相应地进行缩放。

如果我能以某种方式从histfit 测量分布的高度,我可以缩放第二个分布以匹配。或者,我可以以一种允许我输入已知均值和标准差的方式拟合第二个分布,然后拟合分布的高度。

理想的方法是将第二个正态分布分别拟合到数据中。这样,高度可能不同,但是对于分布的尾部拟合会更好。

所以问题是:

如何缩放这些分布以匹配高度? 如何以类似于 histfit 的方式分别拟合具有已知均值和标准偏差的高斯分布(使用高度作为参数)?

【问题讨论】:

    标签: matlab statistics curve-fitting gaussian normal-distribution


    【解决方案1】:

    如果您想对正态分布进行非规范化以适合您的直方图,您可以乘以直方图的面积(使用 trapz() 计算,请参阅post 了解更多信息)。例如:

    data = randn(250,1);
    
    % Histogram with histfit
    nbins = 20;
    h = histfit(data,nbins);
    [nelements,bincenters] = hist(data,nbins);
    hold on
    
    % Histogram computed manually and scaled with trapz()
    avg = mean(data);
    stdev = std(data);
    x = sort(data);
    y = exp(- 0.5 * ((x - avg) / stdev) .^ 2) / (stdev * sqrt(2 * pi));
    plot(x, y*trapz(bincenters,nelements),'g','LineWidth',1.5)
    legend('Histogram','Distribution from histfit','Distribution computed manually')
    

    【讨论】:

    • 除非标准偏差相同,否则这与高度不匹配,但这个解决方案无论如何都解决了我的特定应用程序的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2017-11-16
    • 2014-06-13
    • 1970-01-01
    相关资源
    最近更新 更多