我有一个样本,它是一个包含 220 个数字的向量。这是我的数据直方图的链接。. 我希望检查我的数据是否符合帕累托分布,但我不想看到具有该分布的 QQ 图,但我需要 R 中 p 值的准确答案,例如 Anderson-Darling 正态性检验 ( ad.test
) . 我怎么能那样做?请尽可能具体。
如何知道我的数据是否符合帕累托分布?
机器算法验证
r
分布
帕累托分布
2022-03-30 13:14:41
1个回答
(PS)首先,我认为 Glen_b 在他上面关于这种测试的有用性的评论中是正确的:真实数据肯定不完全是帕累托分布的,对于大多数实际应用,问题是“帕累托近似有多好?” – QQ 图是展示这种近似质量的好方法。
在通过最大似然估计参数之后,您可以通过任何方式使用 Kolmogorov-Smirnov 统计量进行测试。此参数估计阻止使用来自 的值,因此您可以进行参数引导来估计它。正如 Glen_b 在评论中所说,这可以连接到Lilliefors test。ks.test
这里有几行 R 代码。
首先定义处理帕累托分布的基本函数。
# distribution, cdf, quantile and random functions for Pareto distributions
dpareto <- function(x, xm, alpha) ifelse(x > xm , alpha*xm**alpha/(x**(alpha+1)), 0)
ppareto <- function(q, xm, alpha) ifelse(q > xm , 1 - (xm/q)**alpha, 0 )
qpareto <- function(p, xm, alpha) ifelse(p < 0 | p > 1, NaN, xm*(1-p)**(-1/alpha))
rpareto <- function(n, xm, alpha) qpareto(runif(n), xm, alpha)
以下函数计算参数的 MLE(Wikipedia中的理由)。
pareto.mle <- function(x)
{
xm <- min(x)
alpha <- length(x)/(sum(log(x))-length(x)*log(xm))
return( list(xm = xm, alpha = alpha))
}
这个函数计算 KS 统计量,并使用参数引导来估计值。
pareto.test <- function(x, B = 1e3)
{
a <- pareto.mle(x)
# KS statistic
D <- ks.test(x, function(q) ppareto(q, a$xm, a$alpha))$statistic
# estimating p value with parametric bootstrap
B <- 1e5
n <- length(x)
emp.D <- numeric(B)
for(b in 1:B)
{
xx <- rpareto(n, a$xm, a$alpha);
aa <- pareto.mle(xx)
emp.D[b] <- ks.test(xx, function(q) ppareto(q, aa$xm, aa$alpha))$statistic
}
return(list(xm = a$xm, alpha = a$alpha, D = D, p = sum(emp.D > D)/B))
}
现在,例如,来自帕累托分布的样本:
> # generating 100 values from Pareto distribution
> x <- rpareto(100, 0.5, 2)
> pareto.test(x)
$xm
[1] 0.5007593
$alpha
[1] 2.080203
$D
D
0.06020594
$p
[1] 0.69787
...并从:
> # generating 100 values from chi square distribution
> x <- rchisq(100, df=2)
> pareto.test(x)
$xm
[1] 0.01015107
$alpha
[1] 0.2116619
$D
D
0.4002694
$p
[1] 0
请注意,我并不是说这个测试是无偏的:当样本很小时,可能存在一些偏差。参数引导程序没有很好地考虑参数估计的不确定性(想想如果某些方差未知的正常变量的平均值为零时使用这种策略天真地测试会发生什么)。
PS Wikipedia对此说了几句话。以下是建议采用类似策略的另外两个问题:混合的拟合优度检验、伽马分布的拟合优度检验。
其它你可能感兴趣的问题