是否有一种简单的方法可以在R中拟合多元回归,其中因变量是根据Skellam distribution(两个泊松分布计数之间的差异)分布的? 类似的东西:
myskellam <- glm(A ~ B + C + D, data = mydata, family = "skellam")
这应该适应固定效果。但理想情况下,我更喜欢随机效果,因为据我所知,固定效应可能会引入测量偏差。因此,我认为理想的解决方案应该是使用lme4
或glmmADMB
包。
或者,有没有办法转换数据以应用更常用的回归工具?
答案 0 :(得分:3)
答案不完整,但似乎不仅仅是评论。
混合效果似乎很难;您可以使用AD Model Builder或Template Model Builder执行此操作,两者都具有拉普拉斯近似的内置工具。对于固定效果,您可以使用类似
的内容library("skellam")
library("bbmle")
将dskellam(x, lambda1, lambda2)
重新参数化为基本位置的形式(几何平均值lambda = gmlambda
= sqrt(lambda1*lambda2)
)和形状(lambda中的差异:ldiff=sqrt(lambda1/lambda2)
(以便{{} 1}},lambda1=gmlambda*ldiff
)。
lambda2=gmlambda/ldiff
然后这样的事情应该有效:
dskellam2 <- function(x, gmlambda, ldiff, log=FALSE) {
dskellam(x,gmlambda*ldiff,gmlambda/ldiff,log=log)
}
......但要让它发挥作用可能会有些烦恼。
答案 1 :(得分:3)
这是@BenBolker答案的变体,根据均值和方差进行参数化。
如果你将对数似然写为均值和方差的函数,你可以得到类似GLM的东西,将均值表示为协变量的线性函数,并使用optim()
得到MLE和Hessian。
平均值为mu1-mu2
,方差为mu1+mu2
。这两个参数可以写成均值和方差的函数,即:
mu1 <- (mn+va)/2
mu2 <- (va-mn)/2
约束是mu1
和mu2
是正面的。为实现这一目标,Skellam的均值必须小于方差。这表明将方差重新参数化为:
va <- max(abs(mn)) + va_st
将va_st
视为要估算的参数。
把所有这些放在一起:
library(skellam)
logL_Skellam <- function(pars, X, Y){
mn <- X %*% pars[1:ncol(X)]
va_st <- exp(pars[ncol(X)+1]) # constrain to be positive
va <- max(abs(mn)) + va_st
# convert to parameters of skellam
mu1 <- (mn+va)/2
mu2 <- (va-mn)/2
# optim minimizes so return negative LL
-sum(dskellam(Y, mu1, mu2, log=T))
}
优化:
# simulated data
set.seed(103)
npars <- 3
nobs <- 300
X <- cbind(1, matrix(rnorm(nobs*(npars-1)), nrow=nobs))
beta <- rnorm(npars)
va <- max(abs(X%*%beta)) + 3.3
Y <- rskellam(nobs, (X%*%beta+va)/2, (va-X%*%beta)/2)
# fit
fit <- optim(c(0,0,0,5), logL_Skellam, X=X, Y=Y, hessian=T)
注意optim
实际收敛。 MLE和标准。回归系数的误差:
fit$par[1:npars] # MLE
sqrt(diag(solve(fit$hessian)))[1:npars] # std error
我要补充说,为了包含随机效果,可以在任何一个答案中使用带有参数化的MCMC,使用预先打包的采样器,如STAN或JAGS(您需要使用{{ 3)}在JAGS中)。最困难的部分可能是在Skellam PMF中移植贝塞尔函数。