我只能根据经验使用模拟来回答我的问题。使用这两个混合和逻辑的交叉验证贡献,我可以创建一些假数据集并使用混合逻辑回归。使用 library(lme4) 中的 R 和 glmer 我使用了这个公式:
fit1 <- glmer(y ~ x1 + (1|j), data = d, family=binomial)
y 是二分变量,x1 是连续变量,j 是随机变量。首先,我构建了一个平衡数据集d,其中包含 20 个组的分组变量 j。然后我从d构建两个数据集,其中 m 个组只有一个观察值。
模拟表明,j 的方差和 x 的固定系数 b1 与所有类型数据集的“真实”值非常相似。这是由于“完美”随机化。实际上会有一些偏差。
这个答案的局限性:缺乏理论基础(但直觉上是有道理的)。如果封装在一个循环中以获得许多估计并将平均值与真实值 var(uj) 和系数 b1 进行比较,则可以改进模拟。
模拟:
# -- Model
# yj[i] = b*0 b1*xj[i]
# b0 = g00 + u0j, u0j ~ N(0,1)
# b1 = const
# => zj[i] = g00 + u0j[i] + b1*xj[i]
# -- Libraries
library(lme4)
library(sqldf)
# -- Create balanced dataset d
# Number of clusters (level 2)
N <- 20
# Number of observations (level 1) for cluster j
nj <- 200
# intercept
g00 <- 1
# slope
b1 <- 3
# Vector of clusters indices 1,1...n1,2,2,2,....n2,...N,N,....nN
j <- c(sapply(1:N, function(x) rep(x, nj)))
# Vector of random variable
uj <- c(sapply(1:N, function(x)rep(rnorm(1), nj)))
# Vector of fixed variable
x1 <- rep(rnorm(nj),N)
# linear combination
z <- g00 + uj + b1*x1
# pass trhough an inv-logit function
pr <- 1/(1 + exp(-z))
# bernoully response variable
y <- rbinom(N*nj,1,pr)
d <- data.frame(j, y=y, z=z,x1=x1, uj=uj)
# -- Create unbalanced datasets d2 and d3
# sort j
d <- sqldf("SELECT * FROM d ORDER BY j")
# count each observation within j
d$ord <- NA
d$ord[1] <- 1
k <- 2
for (i in 2:nrow(d) ) {
if ( d$j[i] == d$j[i-1] ) {
d$ord[i] <- k
k = k+1
} else {
d$ord[i] <- 1
k = 2
}
}
# result
d[c(190:210),]
# Define a sample with m groups which have only one observation
m <- 5
d2 <- subset(d, j %in% c(1:m)
| ( j %in% c((m+1):20) & ord == 1)
)
# Another sample
d3 <- subset(d, j %in% c(1:m)
| ( j %in% c((m+1):20) & ord == 10)
)
# Fit with balanced dataset d
fit1 <- glmer(y ~ x1 + (1|j), data = d, family=binomial)
summary(fit1)
# fit with unbalanced data d2
fit2 <- glmer(y ~ x1 + (1|j), data = d2, family=binomial)
summary(fit2)
# fit with unbalanced data d3
fit3 <- glmer(y ~ x1 + (1|j), data = d3, family=binomial)
summary(fit3)