我如何适应Skellam回归?

时间:2015-09-03 09:37:59

标签: r statistics glm lme4 mixed-models

是否有一种简单的方法可以在R中拟合多元回归,其中因变量是根据Skellam distribution(两个泊松分布计数之间的差异)分布的? 类似的东西:

myskellam <- glm(A ~ B + C + D, data = mydata, family = "skellam")

这应该适应固定效果。但理想情况下,我更喜欢随机效果,因为据我所知,固定效应可能会引入测量偏差。因此,我认为理想的解决方案应该是使用lme4glmmADMB包。

或者,有没有办法转换数据以应用更常用的回归工具?

2 个答案:

答案 0 :(得分:3)

答案不完整,但似乎不仅仅是评论。

混合效果似乎很难;您可以使用AD Model BuilderTemplate 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

约束是mu1mu2是正面的。为实现这一目标,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中移植贝塞尔函数。