如何在R中拟合频率分布?

4
有没有一种函数可以用来拟合R中的频率分布?我知道有fitdistr,但据我所知它只适用于数据向量(随机样本)。此外,我知道在两种格式之间转换很容易,但频率太大,内存是一个问题。
例如,fitdistr可以这样使用:
x<-rpois(100, lambda=10)
fitdistr(x,"poisson")

有没有一个函数可以在频率表上进行相同的拟合?大致如下:

freqt <- as.data.frame(table(x))
fitfreqtable(freqt$x, weights=freqt$Freq, "poisson")

谢谢!

2
你能举一个非向量数据的例子来说明这些问题吗? - gung - Reinstate Monica
@gung,非常感谢您的快速回复。您说得对,这个问题只涉及到R,所以我很抱歉发布了离题的内容。我会将其标记为推荐。 - Florin Coras
@Dason,我想避免这种情况,因为频率可能会累加到数十亿。 - Florin Coras
你只对泊松分布感兴趣吗?还是其他分布也有兴趣? - Dason
如果您只需要泊松分布,可以直接最大化似然函数;代数上 - 参数估计值就是均值,可以从表格中轻松计算出来,而且估计器的方差也非常简单。 - Glen_b
显示剩余3条评论
3个回答

5

据我所知,没有内置的函数可以将分布拟合到频率表中。需要注意的是,在理论上,连续分布对于表格是不适当的,因为数据是离散的。当然,对于足够大的N和足够细的网格,这可以忽略不计。

如果您知道感兴趣的密度函数,可以使用optim或任何其他优化器构建自己的模型拟合函数。我在这里为伽马分布构建了一个模型拟合函数(虽然这对于那个特定的数据集来说是错误的假设,但不要在意这个)。

下面是代码复制。

negll <- function(par, x, y)
{
    shape <- par[1]
    rate <- par[2]
    mu <- dgamma(x, shape, rate) * sum(y)
    -2 * sum(dpois(y, mu, log=TRUE))
}


optim(c(1, 1), negll, x=seq_along(g$count), y=g$count, method="L-BFGS-B", lower=c(.001, .001))
$par
[1] 0.73034879 0.00698288

$value
[1] 62983.18

$counts
function gradient 
      32       32 

$convergence
[1] 0

$message
[1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"

谢谢您的回答。我本希望避免构建自己的模型拟合函数,但正如您所提到的,似乎没有类似于fitdistr的曲线拟合程序。 - Florin Coras

0

ForestFit中的函数fixtmixturegrouped可用于使用分组数据拟合其他分布模型。

它可以基于“gamma”、“log-normal”、“skew-normal”和“weibull”拟合简单或混合分布模型。

对于泊松分布,只需要人口平均值作为参数。对您的数据应用简单的摘要函数就足够了(如ntzortzis建议的那样)。


0

对于拟合泊松分布,您只需要样本的均值。然后,均值等于λ,这是泊松分布的唯一参数。例如:

set.seed(1111)
sample<-rpois(n=10000,l=10)
mean(sample)
[1] 10.0191

这个值几乎等于创建样本时设置的 lambda 值(l=10)。小差异(0.0191)是由泊松分布随机值生成器的随机性造成的。当你增加 n 时,差异会变得更小。 或者,你可以使用优化方法来拟合分布:

library(fitdistrplus)
fitdist(sample,"pois")
set.seed(1111)

Fitting of the distribution ' pois ' by maximum likelihood 
Parameters:
       estimate Std. Error
lambda  10.0191 0.03165296

但这只是浪费时间。 关于拟合频率数据的理论信息,您可以在我的答案这里中查看。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接