R 如何拟合Skellam回归?
有没有一种简单的方法来拟合R中的多元回归,其中因变量按照(两个泊松分布计数之间的差异)分布? 比如:R 如何拟合Skellam回归?,r,statistics,glm,lme4,mixed-models,R,Statistics,Glm,Lme4,Mixed Models,有没有一种简单的方法来拟合R中的多元回归,其中因变量按照(两个泊松分布计数之间的差异)分布? 比如: myskellam <- glm(A ~ B + C + D, data = mydata, family = "skellam") myskellam答案不完整,但似乎不仅仅是一句评论 混合效应似乎很难;你可以用或来做,两者都有内置的拉普拉斯近似功能。对于固定效果,您可以使用 library("skellam") library("bbmle") 重新参数化dskellam(x,la
myskellam <- glm(A ~ B + C + D, data = mydata, family = "skellam")
myskellam答案不完整,但似乎不仅仅是一句评论
混合效应似乎很难;你可以用或来做,两者都有内置的拉普拉斯近似功能。对于固定效果,您可以使用
library("skellam")
library("bbmle")
重新参数化dskellam(x,lambda1,lambda2)
为基本上是位置(几何平均值lambda=gmlambda
=sqrt(lambda1*lambda2)
)和形状(lambda的差异:ldiff=sqrt(lambda1/lambda2)
(因此lambda1=gmlambda*ldiff
,da2=gmda/ldiff>)
…但要使它起作用可能需要一些麻烦。这里是@BenBolker答案的一个变体,根据均值和方差进行参数化
如果将对数似然度作为均值和方差的函数,将均值表示为协变量的线性函数,并使用optim()
获得MLE和Hessian,则可以得到类似GLM的结果
均值为mu1-mu2
,方差为mu1+mu2
。这两个参数可以写成均值和方差的函数,即:
mu1 <- (mn+va)/2
mu2 <- (va-mn)/2
并将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))
}
我要补充的是,为了包含随机效应,在两种答案中都可以使用MCMC和参数化,使用预先包装好的采样器,如STAN或JAGS(您需要使用in JAGS)。最困难的部分可能是将贝塞尔函数移植到Skellam PMF中。非常感谢。尽管我有点害怕“麻烦”,我还是会尝试一下部分。也非常感谢,我将尝试将此作为一种替代方案,并随时向您通报。我想指出,Skellam
软件包现在具有有限的回归功能。请参阅:
mu1 <- (mn+va)/2
mu2 <- (va-mn)/2
va <- max(abs(mn)) + 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)
fit$par[1:npars] # MLE
sqrt(diag(solve(fit$hessian)))[1:npars] # std error