将数据拟合到分布?

Leg*_*end 28 python statistics r scipy

我不是一个统计学家(更像是一个研究性的网络开发者),但我现在听到很多关于scipyR的信息.因此,出于好奇,我想问这个问题(虽然这对这里的专家来说可能听起来很愚蠢),因为我不确定这方面的进展,并想知道没有合理统计背景的人如何处理这些问题.

给定从实验中观察到的一组实数,让我们说它们属于那里的许多分布之一(如Weibull,Erlang,Cauchy,Exponential等),是否有任何自动化的方法来找到正确的分布和分布数据的参数?是否有任何好的教程可以引导我完成整个过程?

现实场景: 例如,让我们说我发起了一项小型调查并记录了一个人每天与300人谈话的人数,并且我有以下信息:

1 10
2 5
3 20
...
...
Run Code Online (Sandbox Code Playgroud)

XY告诉我X人在调查期间与Y人交谈过.现在使用来自300个人的信息,我想将其融入模型中.问题归结为是否有任何自动方法可以找到这些数据的正确分布和分布参数,或者如果没有,是否有一个很好的逐步程序来实现相同的目标?

Jam*_*son 38

这是一个复杂的问题,并没有完美的答案.我将尝试向您概述主要概念,并指出您对该主题的一些有用的阅读方向.

假设您是一维数据集,并且您拥有一组有限的概率分布函数,您认为这些函数可能是从中生成的.您可以单独考虑每个分布,并尝试根据您的数据查找合理的参数.在给定数据的情况下,有两种方法可以设置概率分布函数的参数:

  1. 最小二乘
  2. 最大似然

根据我的经验,近年来最大可能性是最优选的,尽管在每个领域都不是这种情况.

下面是如何估算R中参数的具体示例.考虑一组由高斯分布生成的随机点,平均值为0,标准差为1:

x = rnorm( n = 100, mean = 0, sd = 1 )
Run Code Online (Sandbox Code Playgroud)

假设您知道数据是使用高斯过程生成的,但您已经忘记(或永远不知道!)高斯参数.您希望使用这些数据来合理估算平均值和标准差.在R中,有一个标准库使这非常简单:

library(MASS)
params = fitdistr( x, "normal" )
print( params )
Run Code Online (Sandbox Code Playgroud)

这给了我以下输出:

      mean           sd     
  -0.17922360    1.01636446 
 ( 0.10163645) ( 0.07186782)
Run Code Online (Sandbox Code Playgroud)

这些都非常接近正确的答案,括号中的数字是参数周围的置信区间.请记住,每次生成一组新的点时,您都​​会得到估算值的新答案.

在数学上,这是使用最大似然来估计高斯的平均值和标准偏差.可能性意味着(在这种情况下)"给定参数值的数据概率".最大似然意味着"最大化生成输入数据概率的参数值".最大似然估计是用于找到最大化生成输入数据的概率的参数值的算法,并且对于一些分布,它可以涉及数值优化算法.在R中,大部分工作都是由fitdistr完成的,在某些情况下会调用optim.

您可以从参数中提取对数似然性,如下所示:

print( params$loglik )
[1] -139.5772
Run Code Online (Sandbox Code Playgroud)

使用对数似然而不是避免舍入错误的可能性更常见.估计数据的联合概率涉及概率乘以小于1.即使对于一小组数据,联合概率非常快地逼近0,并且添加数据的对数概率等于概率乘以.随着对数似然逼近0,可能性最大化,因此更多负数更适合您的数据.

使用这样的计算工具,可以很容易地估计任何分布的参数.考虑这个例子:

x = x[ x >= 0 ]

distributions = c("normal","exponential")

for ( dist in distributions ) {
    print( paste( "fitting parameters for ", dist ) )
    params = fitdistr( x, dist )
    print( params )
    print( summary( params ) )
    print( params$loglik )
}
Run Code Online (Sandbox Code Playgroud)

指数分布不会产生负数,所以我在第一行中删除了它们.输出(随机)看起来像这样:

[1] "fitting parameters for  normal"
      mean          sd    
  0.72021836   0.54079027 
 (0.07647929) (0.05407903)
         Length Class  Mode   
estimate 2      -none- numeric
sd       2      -none- numeric
n        1      -none- numeric
loglik   1      -none- numeric
[1] -40.21074
[1] "fitting parameters for  exponential"
     rate  
  1.388468 
 (0.196359)
         Length Class  Mode   
estimate 1      -none- numeric
sd       1      -none- numeric
n        1      -none- numeric
loglik   1      -none- numeric
[1] -33.58996
Run Code Online (Sandbox Code Playgroud)

指数分布实际上比正态分布更可能生成此数据,这可能是因为指数分布不必将任何概率密度分配给负数.

当您尝试将数据拟合到更多分布时,所有这些估计问题都会变得更糟.具有更多参数的分布更灵活,因此它们比具有更少参数的分布更适合您的数据.此外,一些分布是其他分布的特殊情况(例如,指数Gamma的特例).因此,使用先验知识将您的选择模型约束到所有可能模型的子集是很常见的.

解决参数估计中的一些问题的一个技巧是生成大量数据,并留下一些数据用于交叉验证.要交叉验证参数与数据的拟合,请将某些数据保留在估算过程之外,然后在剩余数据上测量每个模型的可能性.


Ram*_*ath 11

看看fitdistrplus(http://cran.r-project.org/web/packages/fitdistrplus/index.html).

一些快速的事情需要注意:

  • 尝试使用该函数descdist,该函数提供数据的偏斜与峰度的关系图,并显示一些常见的分布.
  • fitdist 允许您根据密度和cdf拟合您可以定义的任何分布.
  • 然后gofstat,您可以使用它来计算KS和AD统计数据,这些统计数据用于衡量拟合距数据的距离.


det*_*tly 6

这可能比你需要的更普遍,但可能会给你一些东西继续下去.

从随机数据估计概率密度函数的一种方法是使用Edgeworth或Butterworth扩展.这些近似使用称为累积量的密度函数属性(其无偏估计量是k-统计量)并且将密度函数表示为来自高斯分布的扰动.

这些都有一些相当可怕的弱点,例如产生发散密度函数,甚至是某些区域负面的密度函数.然而,有些人发现它们对于高度聚类的数据有用,或者作为进一步估计的起点,或者用于分段估计的密度函数,或者作为启发式的一部分.

MG Kendall和A. Stuart,先进的统计理论,第一卷.1,查尔斯格里芬,1963年,是我发现的最完整的参考资料,有一整页专门讨论这个主题; 大多数其他文本最多只有一个句子,或列出了时刻而不是累积量的扩展,这有点无用.祝你好好找一份副本,但我不得不派我的大学图书管理员前往档案馆去旅行......但这是多年前的事,所以也许互联网今天会更有帮助.

您问题的最一般形式是称为非参数密度估计的字段的主题,其中给出:

  • 来自具有未知分布的随机过程的数据,以及
  • 对基础过程的约束

...您生成的密度函数最有可能产生数据.(更现实地,您创建了一种在任何给定点计算此函数近似值的方法,您可以将其用于进一步的工作,例如,比较两组随机数据的密度函数,看它们是否可以来自同一个处理).

但就个人而言,我对使用非参数密度估计的任何有用的东西都没什么好运,但如果你有稳定的理智供应,你应该研究它.