带权重的 R 拟合泊松分布

机器算法验证 r 分布 泊松分布
2022-03-15 17:33:19

我想拟合泊松分布,但我想加权一些更重要的值。有没有办法在 R 中使用fitdistr()或一些等效功能来做到这一点?这是我目前所拥有的:

randoms <- rpois(15,10)
weighting <- seq(1, 100, by=1)
fit <- fitdistr(randoms, "poisson")

我想使用“加权”数据作为强调数据集末尾观察的一种方式。

3个回答

请注意, 'fitdistr只做最大似然估计。也就是说,你可以通过写下可能性来自己做。下面是 R 中泊松分布的一个示例。它可以调整为对每个数据的可能性的贡献进行加权/降低权重。


密度(如在 R 中)

f(x;λ)=λxexp(λ)x!,λ>0

可能性

L(λ;x)=i=1n{λxiexp(λ)xi!}

对数似然

(λ;x)=i=1n{xilog(λ)λlog(xi!)}

的二阶导数

d2dλ2(λ;x)=i=1nxiλ2=1λ2nx¯


#------data------
set.seed(730)
sample <- rpois(1000, 10)
#----------------

 ################################################################################
 # Using 'fitdistr'                                                             #
 ################################################################################

 library(MASS)
 fitdistr(x=sample, densfun="Poisson")
 lambda  
   10.1240000 
   ( 0.1006181)

 ################################################################################
 # writing down the log-likelihood explicitly                                   #
 ################################################################################

 #------minus log-likelihood------
 mloglik <- function(lambda2, sample) #lambda2 = log(lambda) in (-\infty, \infty)
 {
  - sum(sample * lambda2 - exp(lambda2) - log(factorial(sample)))
 }
 #--------------------------------

 #------optimisation------
 res <- nlm(f=mloglik, p=1, sample=sample)
 #------------------------

 #------recover lambda------
 lambda <- exp(res$estimate)
 round(lambda, 7)
 [1] 10.12399
 #--------------------------

 #------standard error------
 #square root of negative inverse second derivative of the log-likelihood
 se <- lambda / sqrt(length(sample) * mean(sample))
 round(se, 7)
 [1] 0.100618
 #--------------------------

如果你只是为了泊松分布(你只是在估计一个参数 lambda 的点估计),你可以使用这个glm函数:

fit2 <- glm(randoms ~ 1, family = poisson(link = "log"),
  weights = weighting[1:15])

作为检查,

fit1 <- glm(randoms ~ 1, family = poisson(link = "log"))
all.equal(unname(exp(coef(fit1))), unname(fit$estimate))
# [1] TRUE

另一个检查:

randoms2 <- rep(randoms, weighting[1:15])
fit3 <- glm(randoms2 ~ 1, family = poisson(link = "log"))

all.equal(exp(coef(fit3)), exp(coef(fit2)))
# [1] TRUE

如果你看一下可能性,它唯一同时依赖于 lambda 和 x 的是乘积 lambda^x_i,它是 lambda^{sum x_i}。因此,x 的总和,或等效的样本均值,对于 lambda 来说是一个足够的统计量。

这意味着您通过使用样本均值估计均值来“拟合泊松”。(然后您会查看具有该均值的泊松与您的数据的拟合程度。)

回到 OP 的加权问题,这意味着你计算一个加权平均值,并用它来估计 lambda。