如何检查我的数据是否符合对数正态分布?

机器算法验证 r 回归 分布 对数正态分布 帕累托分布
2022-03-26 22:13:46

我想检查R我的数据是否符合对数正态分布或帕累托分布。我怎么能那样做?也许ks.test可以帮助我做到这一点,但我怎样才能为我的数据获取帕累托分布的参数?αk

3个回答

...我刚刚注意到您那里有“回归”标签。如果您确实有回归问题,则无法查看响应的单变量分布来评估分布形状,因为它取决于 x 的模式。如果您要检查某种回归或 GLM 中的响应 (y) 变量是否具有对数正态分布或帕累托分布,其中均值在观察中有所不同,这是一个非常不同的问题(但基本上归结为类似类型的分析在残差上)。你能澄清一下这是否是一个回归问题。目前,我的回答与评估单变量对数正态或帕累托有关

你有一些完全不同的问题。

如何检查我的数据是否符合对数正态分布?

取日志,做一个正常的QQ图。查看分布是否足够接近您的目的。

如果我的数据符合对数正态分布或帕累托分布,我想检查 R

从一开始就接受您考虑的所有分布都不是准确的描述。您正在寻找一个合理的模型。这意味着在小样本量下,您不会拒绝任何合理的选择,但如果样本量足够大,您将全部拒绝。更糟糕的是,样本量大时,你会拒绝完全体面的模型,而样本量小,你不会拒绝糟糕的模型。

这样的测试并不是模型选择的真正有用的基础。

简而言之,您感兴趣的问题 - 例如“什么是该数据的好模型,一个足够接近以使后续推理有用的模型?” 拟合优度测试根本无法回答。然而,在某些情况下,拟合优度统计数据(而不是基于它们的拒绝规则得出的决定)可能在某些情况下提供特定类型的不拟合的有用总结。

也许 ks.test 可以帮助我做到这一点

不。首先,我刚才提到的问题,其次,Kolmogorov-Smirnov 检验是对完全指定分布的检验。你没有其中之一。

在许多情况下,我会推荐 QQ 图和类似的显示。对于像这样的右偏斜情况,我倾向于使用对数(对数正态看起来很正常,而帕累托看起来是指数的)。在合理的样本量下,不难从视觉上区分数据看起来是否比指数更接近正常,反之亦然。首先,从每个样本中获取一些实际数据并绘制它们 - 至少说六个样本,这样你就知道它们是什么样子了。

请参阅下面的示例

如何获取数据的帕累托分布的 alpha 和 k 参数?

如果您需要估计参数,请使用 MLE ......但不要这样做来决定帕累托和对数正态。

你能说出其中哪些是对数正态,哪些是帕累托吗?

在此处输入图像描述

请注意,对于正常的 QQ 图(左列),我们看到数据集 1 的日志给出了一条相当直线,而数据集 2 显示了右偏度。对于指数图,数据集 1 的对数显示右尾比指数轻,而数据集 2 显示一条相当直线(即使模型正确,右尾中的值也往往会摆动一点;这是重尾并不罕见;这就是为什么您需要绘制几个与您正在查看的样本大小相似的样本以查看图通常是什么样子的原因之一)

用于绘制这四个图的代码:

qqnorm(log(y1))
qqnorm(log(y2))
qex <- function(x) qexp((rank(x)-.375)/(length(x)+.25))
plot(qex(y1),log(y1))
plot(qex(y2),log(y2))

如果你有一个回归类型的问题——一个平均值随其他变量变化的问题,你实际上只能在存在合适的平均值模型的情况下评估任一分布假设的适用性。

当然,这是模型选择的问题,假设您只想检查您的数据是来自一个模型还是另一个模型,并且您的目标不是在无限维度的分布海洋中找到正确的模型。因此,一种选择是使用AIC(它有利于具有最低 AIC 值的模型,我不会在此尝试描述)。看看以下带有模拟数据的示例:

rm(list=ls())

set.seed(123)
x = rlnorm(100,0,1)

hist(x)

# Loglikelihood and AIC for lognormal model

ll1 = function(param){
if(param[2]>0) return(-sum(dlnorm(x,param[1],param[2],log=T)))
else return(Inf)
}

AIC1 = 2*optim(c(0,1),ll1)$value + 2*2

# Loglikelihood and AIC for Pareto model

dpareto=function(x, shape=1, location=1) shape * location^shape / x^(shape + 1)

ll2 = function(param){
if(param[1]>0 & min(x)> param[2]) return(-sum(log(dpareto(x,param[1],param[2]))))
else return(Inf)
}


AIC2 = 2*optim(c(1,0.01),ll2)$value + 2*2

# Comparison using AIC, which in this case favours the lognormal model.

 c(AIC1,AIC2)

也许 fitdistr()?

在此处输入图像描述

require(MASS)
hist(x, freq=F)
fit<-fitdistr(x,"log-normal")$estimate
lines(dlnorm(0:max(x),fit[1],fit[2]), lwd=3)


> fit
meanlog     sdlog 
3.8181643 0.1871289 



> dput(x)
c(52.6866903145324, 39.7511298620398, 50.0577071855833, 33.8671245370402, 
51.6325665911116, 41.1745418750494, 48.4259060939127, 67.0893697776377, 
35.5355051232044, 44.6197404834786, 40.5620805256951, 39.4265590077884, 
36.0718655240496, 56.0205581625823, 52.8039852992611, 46.2069383488226, 
36.7324212941395, 44.7998046213554, 47.9727885542368, 36.3400338997286, 
32.7514839453244, 50.6878893947656, 53.3756089181472, 39.4769689441593, 
38.5432770167907, 62.350999487007, 44.5140171935881, 47.4026606915147, 
57.3723511479393, 64.4041641945078, 51.2286815562554, 60.4921839777139, 
71.6127652225805, 40.6395409719693, 48.681036613906, 52.3489622656967, 
46.6219563536878, 55.6136160469819, 62.3003761050482, 42.7865905767138, 
50.2413659137295, 45.6327941365187, 46.5621907725798, 48.9734785224035, 
40.4828649022511, 59.4982559591637, 42.9450436744074, 66.8393386407167, 
40.7248473206552, 45.9114242834839, 34.2671010054407, 45.7569869970351, 
50.4358523486278, 44.7445606782492, 44.4173298921541, 41.7506552050873, 
34.5657344132409, 47.7099864540652, 38.1680974794929, 42.2126680994737, 
35.690599714042, 37.6748157160789, 35.0840798650981, 41.4775827114607, 
36.6503753230464, 42.7539062488003, 39.2210050689652, 45.9364763482558, 
35.3687017955285, 62.8299659875044, 38.1532612008011, 39.9183076516292, 
59.0662388169057, 47.9032427690417, 42.4419580084314, 45.785859495192, 
59.5254284342724, 47.9161476636566, 32.6868959277799, 30.1039453246766, 
37.7606323857655, 35.754797368422, 35.5239777126187, 43.7874313667592, 
53.0328404605954, 37.4550326357314, 42.7226751172495, 44.898430515261, 
59.7229655935187, 41.0701258705001, 42.1672231656919, 60.9632847841197, 
60.3690132883734, 45.6469334940722, 39.8300067022836, 51.8185235060234, 
44.908828102875, 50.8200011497451, 53.7945569828737, 65.0432670527801, 
49.0306734716282, 35.9442821219144, 46.8133296904456, 43.7514416949611, 
43.7348972849838, 57.592040060118, 48.7913517211383, 38.5555058596449
)