matlab中的均匀分布拟合

时间:2012-10-21 08:58:36

标签: matlab distribution model-fitting

我有一个数据集,并希望使它们适合均匀分布并使用Matlab计算拟合优度。但是,我发现制服不包含在功能' fitdist '中。有没有什么方法可以在Matlab中进行均匀分布拟合?

4 个答案:

答案 0 :(得分:6)

当你说你想要将数据集拟合到制服时,我假设你的意思是你想要估计最适合你的数据集的均匀分布的参数。

这实际上是一个非常有趣的问题。我并不感到惊讶fitdist没有帮助,因为统一分布是一个特例。例如,可以证明在某些情况下,均匀分布参数的最大似然估计不存在,在其他情况下,没有唯一的解决方案。

那么,该怎么办?嗯,均匀分布有两个参数ab,它们定义了密度的下限和上限。让X表示您的数据集(例如,观察的列向量)。 ab的天真估算是:

a = min(X);
b = max(X);

当然,这些估计值会高估(对于a)而低估(对于b)真正的参数几乎肯定,因为从密度中抽取的随机样本不太可能落在边界上。

对于已知a为0的情况,b的最小方差无偏估计为:

b = max(X) + (max(X) / length(X))

这个估算器与着名的German Tank Problem有关。对于一般情况,我实际上并不知道任何估计理论(尽管我确定必须有一些)。我的第一个猜测是使用天真的最小/最大估计,但减去并添加数据集中观察值之间的平均距离,即:

a = min(X) - c;
b = max(X) + c;

,其中

c = (max(X) - min(X)) / length(X)

至于适合度,希望SO上的其他人知道一些事情,因为我需要自己做一些研究才能回答这个问题。祝你好运!

答案 1 :(得分:2)

根据科林的回答,可以使用Pearson's chi-squared test计算均匀分布的拟合度。

如果您可以访问Matlab统计数据工具箱,则可以使用chi2gof函数轻松执行此操作。文档中的示例3显示了如何将其应用于统一分布。

答案 2 :(得分:1)

将变量转换为普通的分布式变量并使用“kstest”。 因此,如果你有一个从a到b均匀的变量X,那就制作下面的代码

X_uni=(X-a)/(b-a); %Uniform 0,1 variable

X_norm=norminv(X_uni); % transform to normal distributed variable
[h,P]=kstest(X_norm) ; %P is the test statistic

答案 3 :(得分:0)

只是为了扩展Alan的回答,知道如何正确使用Pearson's chi-squared test

设置参数

N=100; % sample size
a=0; % lower boundary
b=1; % higher boundary

样本N在a和b之间均匀分布的值。如果你想测试代码,在第二行添加一些bais使它不统一。

x=unifrnd(a,b,N,1);
%x(x<.9) = rand(sum(x<.9),1);

使用chi2gof

正如here描述的chi2gof,你不能使用'假设分布的'cdf',需要指定二进制位,边和期望值。

nbins = 10; % number of bin
edges = linspace(a,b,nbins+1); % edges of the bins
E = N/nbins*ones(nbins,1); % expected value (equal for uniform dist)

[h,p,stats] = chi2gof(x,'Expected',E,'Edges',edges)

使用chi2cdf

使用此功能,您需要提供卡方检验统计量,$ \ displaystyle \ chi ^ {2} $,可以使用函数histogramm计算:

h = histogram(x,edges);
chi = sum((h.Values - N/nbins).^2 / (N/nbins));
k = nbins-1; % degree of freedom
chi2cdf(chi, k)

请注意,如果您不使用边缘来计算每个容器的值数,histogramm将从较低值到最高值选择它们,因此最终得分将与{chi2gof不同1}}

最后,您想使用p值来回答“我能否安全拒绝零假设”(即x不是来自统一分布)? ”。 是的,如果x低于significant level (alpha),您可以放心地说p 来自统一分布。