R:如何将一个大型数据集与多个分布相结合?

R:如何将一个大型数据集与多个分布相结合?,r,statistics,distribution,R,Statistics,Distribution,为了将实值数字(x)数据集与一个分布相匹配,我们可以使用如下质量或分布: fitdistr(x, "gamma") 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] ))

为了将实值数字(
x
)数据集与一个分布相匹配,我们可以使用如下质量或分布:

fitdistr(x, "gamma")
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 )

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

P(X) = Gamma(x) + t(x)
我能用R中的最大似然拟合来拟合混合概率分布的参数吗

对于某些参数,例如a的平均值或a的速率,存在解析表达式。对于其他参数,没有分析估计器,但可以使用来找到合理的参数估计

R中的函数通过调用函数对对数似然函数进行数值优化。如果你认为你的数据是伽马分布和t分布的混合,那么简单地做一个似然函数来描述这种混合。然后,将这些参数值传递给optim()进行优化。以下是使用此方法拟合分布的示例:

fitdistr(x, "gamma")
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 )
在R中运行此程序会产生以下输出:

[1] "mean: 0.0223766157516646"
[1] "sd:   0.991566611447471"
这与均值=0和sd=1的初始值非常接近


不要忘记,对于两个分布的混合,您有一个额外的参数指定分布之间的相对权重。此外,要注意一次拟合大量参数。有很多你需要担心的免费参数

试试mixdist。以下是三种分布的混合示例:


我假设您的意思是(正如其他海报也假设的那样),您的分布是Gamma和t的混合(即,每个单独的点都是从Gamma或t分布中绘制的)。另一个比较棘手的选择是(如果我逐字阅读你的问题,我会认为)单个值是Gamma和t变量的和,也就是说,分布是Gamma和t的卷积。请澄清。如果是后者,我可以建议使用
distr
包的解决方案……两年多后,而不是原始海报,但我对您建议的使用
distr
包的卷积解决方案非常感兴趣。