R:如何使用分布组合拟合大型数据集?

use*_*718 5 statistics r distribution

为了使实数值(x)的数据集与一个分布拟合,我们可以使用MASS,如下所示:gammaStudent t分布:

fitdistr(x, "gamma")
Run Code Online (Sandbox Code Playgroud)

要么

fitdistr(x2, "t")
Run Code Online (Sandbox Code Playgroud)

如果我认为我的数据集应该符合gamma和t分布的总和,该怎么办?

P(X) = Gamma(x) + t(x)
Run Code Online (Sandbox Code Playgroud)

我可以使用R中的最大似然拟合来拟合概率分布混合的参数吗?

Jam*_*son 3

对于某些参数,例如正态分布的均值或指数分布的比率,存在解析最大似然估计量。对于其他参数,没有分析估计器,但您可以使用数值分析来找到合理的参数估计值。

R 中的fitdistr ()函数通过调用optim()函数来使用对数似然函数的数值优化。如果您认为您的数据是 Gamma 和 t 分布的混合,那么只需创建一个描述这种混合的似然函数即可。然后,将这些参数值传递给 optim() 进行优化。以下是使用此方法拟合分布的示例:

library( MASS )

vals = rnorm( n = 10000, mean = 0, sd = 1 ) 
print( summary(x_vals) )

ll_func = function(params) {
   log_probs = log( dnorm( x = vals, mean = params[1], sd = params[2] ))
   tot = sum(log_probs)
   return(-1 * tot)
}       

params = c( 0.5, 10 )

print( ll_func(params) )
res = optim( params, ll_func )
print( res$par )
Run Code Online (Sandbox Code Playgroud)

在 R 中运行该程序会产生以下输出:

[1] "mean: 0.0223766157516646"
[1] "sd:   0.991566611447471"
Run Code Online (Sandbox Code Playgroud)

这非常接近平均值 = 0 和 sd = 1 的初始值。

不要忘记,对于两种分布的混合,您有一个额外的参数来指定分布之间的相对权重。另外,一次拟合大量参数时要小心。由于有大量的自由参数,您需要担心过度拟合