R中的混合回归模型和自定义链接函数?

机器算法验证 r 回归 混合模式 链接功能
2022-04-02 22:49:28

似乎 lmer 的当前版本不允许自定义链接功能。

  1. 如果需要使用自定义链接函数拟合逻辑线性混合效应模型,R 中有哪些可用选项?

  2. 如果没有 - 其他统计/编程包中有哪些选项可用?

  3. 是否存在 lmer 没有自定义链接功能的概念性原因,或者这些约束纯粹是实用/程序化的?

3个回答

道格拉斯·贝茨不久前在 sig-ME 列表中解决了这个问题:

从那以后我不知道有什么重大变化,但他的建议(使用具有指定链接和方差的准家庭)可能有用。希望这可以解决您的第一个和第三个问题。我不知道其他包裹 - 抱歉。

  1. repeated::gnlmix()
  2. PROC NLMIXED -- 如果链接或其逆可以用 SAS 中可用的函数表示。
  3. 我需要深入研究代码。

一些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 的编程方式而不是概念性的。