Matlab 将生成的数据与测量的数据进行比较

Matlab 将生成的数据与测量的数据进行比较,matlab,statistics,distribution,Matlab,Statistics,Distribution,我们已经测量了数据,我们设法确定了它所遵循的分布类型(伽马)及其参数(A,B) 我们使用for-loop从相同的分布、相同的参数和相同的范围(18.5到59之间)生成了n个样本(10000) for i=1:1:10000 tot=makedist('Gamma','A',11.8919,'B',2.9927); tot= truncate(tot,18.5,59); W(i,:) =random(tot,1,1); end 然后,我们尝试使用以下方法拟合生成的数据: h1=histfit(W

我们已经测量了数据,我们设法确定了它所遵循的分布类型(伽马)及其参数(A,B)

我们使用for-loop从相同的分布、相同的参数和相同的范围(18.5到59之间)生成了n个样本(10000)

for i=1:1:10000
tot=makedist('Gamma','A',11.8919,'B',2.9927);
tot= truncate(tot,18.5,59);
W(i,:) =random(tot,1,1);
end
然后,我们尝试使用以下方法拟合生成的数据:

h1=histfit(W);
在此之后,我们尝试绘制伽马曲线,以比较同一图形上的两条曲线:

hold on
h2=histfit(W,[],'Gamma');
h2(1).Visible='off';
问题s两条曲线移动如下图所示“图1为先前代码生成的数据,图2未截断生成的数据”

有人知道为什么吗


提前感谢

默认情况下,
histfit
在直方图上拟合正态概率密度函数(PDF)。我不确定你到底想做什么,但你所做的是:

% fit a normal PDF
h1=histfit(W); % this is equal to h1 = histfit(W,[],'normal');

% fit a gamma PDF
h2=histfit(W,[],'Gamma');
显然,这将导致不同的拟合,因为普通PDF!=伽马PDF。您看到的唯一一件事是,对于gamma PDF,它更适合曲线,因为您从该分布中采样了数据

如果要检查数据是否遵循特定分布,也可以使用。就你而言

% check if the data follows the distribution speccified in tot
[h p] = kstest(W,'CDF',tot) 
如果数据遵循伽马距离,则h=0且p>0.05,否则h=1且p<0.05

现在,对您的代码进行一些一般性评论: 请向上看,这将大大加快循环速度。例如

W = zeros(10000,1);
for i=1:1:10000
    tot=makedist('Gamma','A',11.8919,'B',2.9927);
    tot= truncate(tot,18.5,59);
    W(i,:) =random(tot,1,1);
end
而且

不依赖于循环中的索引,因此可以移动到循环前面以进一步加快速度。这也是一种很好的做法

但实际上可以跳过整个循环,因为
random()
允许一次返回多个样本:

tot=makedist('Gamma','A',11.8919,'B',2.9927);
tot= truncate(tot,18.5,59);
W =random(tot,10000,1);

截断将改变分布。@pjs我们在没有截断的情况下尝试了相同的代码,并且两条曲线也发生了移动。首先感谢您的有用评论,它们将加快程序的速度。我的问题是如何比较从特定分发中生成的数据,以确保它符合从中生成的分发类型??为什么要检查?如果您直接从特定分布中采样,则已经给出它遵循该分布。但是如果您想检查某些数据是否遵循某个分布,您可以a)目视检查
histfit
曲线是否拟合良好,或者b)使用KS测试(稍微复杂一点)我们使用了交换文件“allfitdist.m”Mike Sheppard写的,它给出了最适合我们测量数据的曲线是Gamma,当我们在生成的数据上再次使用它时,它给出了另一个具有不同参数的分布,为什么?问题是,在给定正确参数的情况下,许多分布彼此相似。如果同时绘制GEV和gamma距离的PDF,使用给定的参数,您将看到形状看起来几乎相同。因此,即使数据中的细微变化也可以交换最佳匹配距离。。这意味着两个区都是。很好地拟合数据,您可以选择两个分布中的任何一个—这不会产生明显的差异。但我会选择伽马距离,因为它的参数较少(奥卡姆剃刀)
tot=makedist('Gamma','A',11.8919,'B',2.9927);
tot= truncate(tot,18.5,59);
W =random(tot,10000,1);