Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何拟合Skellam回归?_R_Statistics_Glm_Lme4_Mixed Models - Fatal编程技术网

R 如何拟合Skellam回归?

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

有没有一种简单的方法来拟合R中的多元回归,其中因变量按照(两个泊松分布计数之间的差异)分布? 比如:

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