正如@whuber 指出的那样,统计方法在这里并不完全适用。您需要从其他来源推断分布。当您知道分布时,您就有了非线性方程求解练习。用的概率分布的分位数函数。您所拥有的是以下非线性方程组:fθ
q0.05q0.5q0.95=f(0.05,θ)=f(0.5,θ)=f(0.95,θ)
其中是你的分位数。你需要解决这个系统才能找到。现在实际上对于任何 3 参数分布,您都会找到满足该方程的参数值。对于 2 参数和 1 参数分布,该系统是超定的,因此没有精确的解决方案。在这种情况下,您可以搜索一组最小化差异的参数:qθ
(q0.05−f(0.05,θ))2+(q0.5−f(0.5,θ))2+(q0.95−f(0.95,θ))2
这里我选择了二次函数,但你可以选择任何你想要的。根据@whuber 评论,您可以分配权重,以便更准确地拟合更重要的分位数。
对于四个或更多参数,系统是欠定的,因此存在无限数量的解决方案。
下面是一些示例 R 代码来说明这种方法。出于演示的目的,我从VGAM包的 Singh-Maddala 分布中生成分位数。该分布有 3 个参数,用于收入分布建模。
q <- qsinmad(c(0.05,0.5,0.95),2,1,4)
plot(x<-seq(0,2,by=0.01), dsinmad(x, 2, 1, 4),type="l")
points(p<-c(0.05, 0.5, 0.95), dsinmad(p, 2, 1, 4))
现在形成评估非线性方程组的函数:
fn <- function(x,q) q-qsinmad(c(0.05, 0.5, 0.95), x[1], x[2], x[3])
检查真值是否满足方程:
> fn(c(2,1,4),q)
[1] 0 0 0
为了求解非线性方程组,我使用nleqslv
包nleqslv中的函数。
> sol <- nleqslv(c(2.4,1.5,4.3),fn,q=q)
> sol$x
[1] 2.000000 1.000000 4.000001
正如我们所看到的,我们得到了确切的解决方案。现在让我们尝试将对数正态分布拟合到这些分位数。为此,我们将使用该optim
功能。
> ofn <- function(x,q)sum(abs(q-qlnorm(c(0.05,0.5,0.95),x[1],x[2]))^2)
> osol <- optim(c(1,1),ofn)
> osol$par
[1] -0.905049 0.586334
现在绘制结果
plot(x,dlnorm(x,osol$par[1],osol$par[2]),type="l",col=2)
lines(x,dsinmad(x,2,1,4))
points(p,dsinmad(p,2,1,4))
由此我们立即看出二次函数并不是那么好。
希望这可以帮助。