根据三个百分点估算分布


23

如果我只知道三个百分点,可以使用哪些方法来推断分布?

例如,我知道在某个数据集中,第五个百分位数是8,135,第50个百分位数是11,259,第95个百分位数是23,611。我希望能够从任何其他数字提高到其百分位数。

这不是我的数据,而这些都是我的全部统计数据。很明显,分布不正常。我仅有的其他信息是,该数据代表政府为不同学区提供的人均经费。

我对统计数据了解得足够多,无法知道这个问题没有确定的解决方案,但是对于知道如何找到正确的猜测还不够。

对数正态分布是否合适?我可以使用哪些工具执行回归(或者我需要自己进行回归)?


我添加了r标签,以便在我的注释中突出显示R代码
mpiktas 2011年

有关同一问题(及其解决方案)的详细示例,请参阅stats.stackexchange.com/questions/133129上的重复线程。
ub

Answers:


17

使用纯统计方法进行这项工作将绝对不会提供有关学校支出分配的其他信息:结果只会反映出算法的任意选择。

您需要更多数据

这很容易做到:使用以前年份,可比地区的数据。例如,可从人口普查站点获得2008年联邦在14866个学区的支出。它表明,在全国范围内,人均(注册的)联邦总收入大致呈对数正态分布,但按州划分,则显示出很大的差异(例如,阿拉斯加的原木支出呈负偏斜,而科罗拉多的原木支出呈强正偏斜) 。使用这些数据来表征可能的分布形式,然后使分位数适合该形式。

如果您甚至接近正确的分布形式,那么您应该能够通过拟合一个或最多两个参数来准确地重现分位数。查找拟合的最佳技术取决于您使用的分布形式,但更重要的是,这取决于您打算将结果用于什么。您是否需要估算平均支出金额?支出上限和下限?不管是什么,您都希望采用某种适合度的方法,这将使您有最大的机会根据结果做出正确的决定。例如,如果您的兴趣集中在所有支出的前10%,则您将希望准确地拟合第95个百分位数,而对拟合第5个百分位数可能并不在乎。没有复杂的装配技术会为您考虑这些因素。

当然,没有人能合法地保证这种以数据为依据的,面向决策的方法会比某些统计方法表现出更好(或更差)的效果,但与纯粹的统计方法不同,这种方法有一个基于现实的基础,着重于您的需求,使其具有一定的信誉和抵制批评的能力。


2
+1 您需要更多数据以及打算将结果用于什么目的,这些都值得您特别强调。
vqv 2011年

2
听起来您的答案有很多智慧。我将不得不向提出我问题的人咨询更多有关他们想要的东西的信息。感谢您的链接和建议。
Mark Eichenlaub

1
@Mark祝你好运!
Whuber

23

正如@whuber所指出的,统计方法在这里并不完全有效。您需要从其他来源推断分布。当您知道分布时,您将进行非线性方程求解练习。表示为参数向量 θ的所选概率分布的分位数函数。您拥有的是以下非线性方程组:fθ

q0.05=f(0.05,θ)q0.5=f(0.5,θ)q0.95=f(0.95,θ)

哪里q是您的分位数。您需要求解该系统才能找到。现在,对于几乎所有3参数分布,您都将找到满足该方程的参数值。对于2参数和1参数分布,该系统是过高确定的,因此没有确切的解决方案。在这种情况下,您可以搜索一组将差异最小化的参数:θ

q0.05-F0.05θ2+q0.5-F0.5θ2+q0.95-F0.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了软件包nlqeslv中的函数。

 > 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))

替代文字

由此我们立即看到二次函数不是很好。

希望这可以帮助。


1
大!mpiktas,感谢您为此付出的所有努力。我不熟悉R,但是您的代码解释得足够好,因此我仍然可以轻松知道您在做什么。
Mark Eichenlaub

非常感谢这个例子。我认为中有2个错误ofn <- function(x,q) sum(abs(q-qlnorm(c(0.05,0.5,0.95),x[1],x[2]))^2)。我提议,ofn <- function(x) sum(abs(q-qlnorm(c(0.05,0.5,0.95),x[1],x[2],x[3]))^2)因为q不是的输入ofn,并且X[3]丢失了。问候


6

对于对数正态,第95个百分位数与中位数的比率与第5个百分位数所占的比率相同。这里甚至还不是真的,所以对数正态法将不是一个很好的选择。

您有足够的信息来使分布具有三个参数,并且显然需要一个偏斜分布。为了简化分析,我建议将对数逻辑分布作为其分位数函数(即其累积分布函数的反函数)可以用相当简单的封闭形式编写,因此您应该能够获得封闭形式的表达式就您的三个分位数而言,用一些代数来表示其三个参数(我将把它留作练习!)。此分布用于洪水频率分析。

但是,这不会给您任何其他分位数估计的不确定性指示。我不知道您是否需要它,但是作为一名统计学家,我认为我应该能够提供,所以我对这个答案并不满意。我当然不会使用这种方法,也可能不会使用任何方法来推断(很多)超出第5个百分点至第95个百分点的范围。


1
谢谢你的建议。回复:对数正态-我可以通过从所有内容中减去7077,然后再将其加回来得出百分位数与中位数的比率。这个想法有多糟糕?
Mark Eichenlaub

1
好的一点是,这将产生“偏移的对数正态分布”。对数正态和对数逻辑在形状上非常相似,除了后者的尾部较重,因此您可以尝试两者并比较结果。
一站式

比较如何?移位后的对数正态分布可以保证完全适合分位数。几乎所有的三参数系列都将非常适合。您如何比较两个完美契合?
whuber

@whuber我的意思比较的百分位数对应的其他值所产生的预测
一站式

我缺少了一些东西:还有什么其他价值?OP指出只有 3个百分位数可用,没有别的。
Whuber

2

关于数据,您唯一可以推断的是分布是不对称的。您甚至无法分辨这些分位数是来自拟合分布还是来自ecdf。

如果它们来自适合的分布,则可以尝试所有可以想到的分布,看看是否有匹配项。如果没有,那么信息就不足够了。您可以将二阶多项式或三阶样条插值用于分位数函数并使用该函数,或者提出有关分布族和匹配分位数的理论,但是使用这些方法所做的任何推论都将深深地令人怀疑。


1
多项式和样条不太可能是有效的CDF。
Whuber

好观察。在这种情况下,通常的二次多项式不起作用,但是有很多二次样条可以选择(认为Bézier),它们不应该有相同的问题(尽管有些仍然需要域裁剪)。同样,应该有可能找到合适的单调三次样条。我知道可以保证单调性的样条算法,但现在还找不到,因此我不得不将问题留在“选择像cdf一样的东西”上。
sesqu 2011年

您甚至可以使单调样条曲线(或其他任何形式)适合分位数的对数,从而在分位数的范围内获得合理的值。但是,这对于拟合超出两个极端分位数的尾部没有任何帮助。应该不愿意让拟合的这一重要方面留给数值拟合程序的偶然特征。
ub

2

关于分位数来估计先验分布参数的使用在有关人类响应时间测量的文献中被讨论为“分位数最大概率估计”(QMPE,尽管最初被错误地称为“分位数最大似然估计”,QMLE),由Heathcote详细讨论。和同事。您可以拟合多个不同的先验分布(高斯分布,对数正态分布,对数正态分布,Wald和Weibull),然后比较每个分布所产生的最佳拟合的总对数似然比,以找出似乎产生最佳拟合的分布风格。


2
保证任何三参数分布都能完美地适合三个分位数 因此,使用这种方法仅拟合一个或两个参数是有意义的。仅根据似然性将一参数拟合与二参数拟合(具有不同的族)进行比较也没有任何意义。
whuber

@whuber,回复:“任何三参数分布都可以保证完全适合三个分位数”。我没有意识到这一点,很高兴知道!回复:“仅基于似然,将一参数拟合与两参数拟合(具有不同的族)进行比较也没有任何意义。” 是的,的确如此;我没有提到,如果将适合度与具有不同数量参数的分布形式进行比较,则必须进行一些复杂度校正(AIC,BIC等)。感谢您指出了这一点。
Mike Lawrence

我有点夸张了,因为我在想两个参数是比例和位置,而第三个参数则包含各种各样的形状。即便如此,大多数三参数系列具有足够的灵活性来适应三个百分位,只要它们都不同即可。
Whuber

1

您可以使用百分位信息以某种方式模拟数据,并使用R包“ logspline”以非参数方式估计分布。下面是我使用这种方法的函数。

calc.dist.from.median.and.range <- function(m, r) 
{
    ## PURPOSE: Return a Log-Logspline Distribution given (m, r).
    ##          It may be necessary to call this function multiple times in order to get a satisfying distribution (from the plot). 
    ## ----------------------------------------------------------------------
    ## ARGUMENT:
    ##   m: Median
    ##   r: Range (a vector of two numbers)
    ## ----------------------------------------------------------------------
    ## RETURN: A log-logspline distribution object.
    ## ----------------------------------------------------------------------
    ## AUTHOR: Feiming Chen,  Date: 10 Feb 2016, 10:35

    if (m < r[1] || m > r[2] || r[1] > r[2]) stop("Misspecified Median and Range")

    mu <- log10(m)
    log.r <- log10(r)

    ## Simulate data that will have median of "mu" and range of "log.r"
    ## Distribution on the Left/Right: Simulate a Normal Distribution centered at "mu" and truncate the part above/below the "mu".
    ## May keep sample size intentionaly small so as to introduce uncertainty about the distribution. 
    d1 <- rnorm(n=200, mean=mu, sd=(mu - log.r[1])/3) # Assums 3*SD informs the bound
    d2 <- d1[d1 < mu]                   # Simulated Data to the Left of "mu"
    d3 <- rnorm(n=200, mean=mu, sd=(log.r[2] - mu)/3)
    d4 <- d3[d3 > mu]                   # Simulated Data to the Right of "mu"
    d5 <- c(d2, d4)                     # Combined Simulated Data for the unknown distribution

    require(logspline)
    ans <- logspline(x=d5)
    plot(ans)
    return(ans)
}
if (F) {                                # Unit Test 
    calc.dist.from.median.and.range(m=1e10, r=c(3.6e5, 3.1e12))
    my.dist <- calc.dist.from.median.and.range(m=1e7, r=c(7e2, 3e11))
    dlogspline(log10(c(7e2, 1e7, 3e11)), my.dist) # Density
    plogspline(log10(c(7e2, 1e7, 3e11)), my.dist) # Probability
    10^qlogspline(c(0.05, 0.5, 0.95), my.dist) # Quantiles 
    10^rlogspline(10, my.dist) # Random Sample 
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.