似乎 lmer 的当前版本不允许自定义链接功能。
如果需要使用自定义链接函数拟合逻辑线性混合效应模型,R 中有哪些可用选项?
如果没有 - 其他统计/编程包中有哪些选项可用?
是否存在 lmer 没有自定义链接功能的概念性原因,或者这些约束纯粹是实用/程序化的?
似乎 lmer 的当前版本不允许自定义链接功能。
如果需要使用自定义链接函数拟合逻辑线性混合效应模型,R 中有哪些可用选项?
如果没有 - 其他统计/编程包中有哪些选项可用?
是否存在 lmer 没有自定义链接功能的概念性原因,或者这些约束纯粹是实用/程序化的?
道格拉斯·贝茨不久前在 sig-ME 列表中解决了这个问题:
从那以后我不知道有什么重大变化,但他的建议(使用具有指定链接和方差的准家庭)可能有用。希望这可以解决您的第一个和第三个问题。我不知道其他包裹 - 抱歉。
repeated::gnlmix()
一些repeated::gnlmix()
例子:
library(repeated)
set.seed(99)
dat <- data.frame(id = c(1,1,1, 2,2,2, 3,3,3, 4,4,4),
y = c(1,0,1, 0,1,1, 0,0,0, 1,1,1),
x = rnorm(12)
)
attach(dat)
y_cbind <- cbind(y, 1-y)
# probit regression
gnlmix(y=y_cbind,
distribution = "binomial",
nest = id,
mixture = "normal",
random = "b_id",
mu = ~ pnorm(beta0 + beta1*x + b_id),
pmu = list(beta0=0, beta1=0),
pmix = log(4)
)
# Location parameters:
# estimate se
# beta0 0.2825 0.7878
# beta1 -0.7628 1.1498
#
# Mixing dispersion parameter:
# estimate se
# 0.4249 2.072
# cauchy link
gnlmix(y=y_cbind,
distribution = "binomial",
nest = id,
mixture = "normal",
random = "b_id",
mu = ~ pcauchy(beta0 + beta1*x + b_id),
pmu = list(beta0=0, beta1=0),
pmix = log(4)
)
# Location parameters:
# estimate se
# beta0 0.6973 1.791
# beta1 -1.2328 2.812
#
# Mixing dispersion parameter:
# estimate se
# 1.805 3.038
# logistic regression
gnlmix(y=y_cbind,
distribution = "binomial",
nest = id,
mixture = "normal",
random = "b_id",
mu = ~ plogis(beta0 + beta1*x + b_id),
pmu = list(beta0=0, beta1=0),
pmix = log(4)
)
# Location parameters:
# estimate se
# beta0 0.4981 1.356
# beta1 -1.2740 2.036
#
# Mixing dispersion parameter:
# estimate se
# 1.496 2.177
# custom link / inverse (logistic regression)
custom_inv <- function(eta) exp(eta) / (exp(eta) + 1)
gnlmix(y=y_cbind,
distribution = "binomial",
nest = id,
mixture = "normal",
random = "b_id",
mu = ~ custom_inv(beta0 + beta1*x + b_id),
pmu = list(beta0=0, beta1=0),
pmix = log(4)
)
# Location parameters:
# estimate se
# beta0 0.4981 1.356
# beta1 -1.2740 2.036
#
# Mixing dispersion parameter:
# estimate se
# 1.496 2.177
# custom link / inverse
custom_inv <- function(eta) log(exp(eta)+1) / (log(exp(eta)+1) + pi/2)
gnlmix(y=y_cbind,
distribution = "binomial",
nest = id,
mixture = "normal",
random = "b_id",
mu = ~ custom_inv(beta0 + beta1*x + b_id),
pmu = list(beta0=0, beta1=0),
pmix = log(4)
)
# Location parameters:
# estimate se
# beta0 4.333 5.477
# beta1 -2.291 5.571
#
# Mixing dispersion parameter:
# estimate se
# 3.879 2.386
对于 GLM,请参见此处gnlm::gnlr()
所示。
正如@Ben Bolker 所指出的,对于 lme4 >= 1.0-4 的版本(大约 09-2013 年),这不是问题。现在可以在 R 代码中指定链接函数 - 这似乎回答了上面的 1) 和 3),答案是链接函数的约束是由于 lme4 pre 1.0 的编程方式而不是概念性的。