我的R脚本在下面生成glm()coeffs。 那么Poisson的lambda是什么?它应该是~3.0,因为我用来创建分发。
Call:
glm(formula = h_counts ~ ., family = poisson(link = log), data = pois_ideal_data)
Deviance Residuals:
Min 1Q Median 3Q Max
-22.726 -12.726 -8.624 6.405 18.515
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 8.222532 0.015100 544.53 <2e-16 ***
h_mids -0.363560 0.004393 -82.75 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for poisson family taken to be 1)
Null deviance: 11451.0 on 10 degrees of freedom
Residual deviance: 1975.5 on 9 degrees of freedom
AIC: 2059
Number of Fisher Scoring iterations: 5
random_pois = rpois(10000,3)
h=hist(random_pois, breaks = 10)
mean(random_pois) #verifying that the mean is close to 3.
h_mids = h$mids
h_counts = h$counts
pois_ideal_data <- data.frame(h_mids, h_counts)
pois_ideal_model <- glm(h_counts ~ ., pois_ideal_data, family=poisson(link=log))
summary_ideal=summary(pois_ideal_model)
summary_ideal
答案 0 :(得分:3)
看起来你正试图对聚合或分箱数据进行泊松拟合;这不是glm
的作用。我快速查看了将分布拟合到固定数据的固定方法,但找不到一个;看起来早期版本的bda
包可能提供了这个,但现在不是。
从根本上说,您需要做的是设置负对数似然函数,该函数计算(# counts)*prob(count|lambda)
并使用optim()
将其最小化;下面使用bbmle
包提供的解决方案在前期稍微复杂一些,但为您提供了额外的好处,例如轻松计算置信区间等。
设置数据:
set.seed(101)
random_pois <- rpois(10000,3)
tt <- table(random_pois)
dd <- data.frame(counts=unname(c(tt)),
val=as.numeric(names(tt)))
这里我使用的是table
而不是hist
,因为离散数据上的直方图很繁琐(有整数分割点经常让事情变得混乱,因为你必须小心右关闭和左关闭)< / p>
为分箱泊松数据设置密度函数(与bbmle
的公式接口一起使用,第一个参数必须调用x
,并且必须有log
参数。
dpoisbin <- function(x,val,lambda,log=FALSE) {
probs <- dpois(val,lambda,log=TRUE)
r <- sum(x*probs)
if (log) r else exp(r)
}
适合lambda(日志链接有助于防止数字问题/警告来自负的lambda值):
library(bbmle)
m1 <- mle2(counts~dpoisbin(val,exp(loglambda)),
data=dd,
start=list(loglambda=0))
all.equal(unname(exp(coef(m1))),mean(random_pois),tol=1e-6) ## TRUE
exp(confint(m1))
## 2.5 % 97.5 %
## 2.972047 3.040009
答案 1 :(得分:2)
你在这做什么??? !!!您使用glm
来拟合分布???
嗯,这不是不可能的,但是通过这个来完成:
set.seed(0)
x <- rpois(10000,3)
fit <- glm(x ~ 1, family = poisson())
即,我们使用仅拦截回归模型拟合数据。
fit$fitted[1]
# 3.005
这与:
相同mean(x)
# 3.005