我有一个数据集,并希望使它们适合均匀分布并使用Matlab计算拟合优度。但是,我发现制服不包含在功能' fitdist '中。有没有什么方法可以在Matlab中进行均匀分布拟合?
答案 0 :(得分:6)
当你说你想要将数据集拟合到制服时,我假设你的意思是你想要估计最适合你的数据集的均匀分布的参数。
这实际上是一个非常有趣的问题。我并不感到惊讶fitdist
没有帮助,因为统一分布是一个特例。例如,可以证明在某些情况下,均匀分布参数的最大似然估计不存在,在其他情况下,没有唯一的解决方案。
那么,该怎么办?嗯,均匀分布有两个参数a
和b
,它们定义了密度的下限和上限。让X
表示您的数据集(例如,观察的列向量)。 a
和b
的天真估算是:
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
来自统一分布。