单次测量重复测量

机器算法验证 混合模式 重复测量 多层次分析
2022-04-12 17:13:54

我有以下情况:全科医生(gp),患者(pat)和咨询(cons)。

每个 gp 有几个病人,每个病人可以有 1 个或多个具有特定特征 cons_x 的咨询。结果是水平咨询的 y=0/1。

一个可能的模型可能是(在 lmer/R 表示法中)

y ~ gp_sex + pat_sex + pat_age + cons_x + (1|gp) + (1|gp:pat)

gp 是一个随机变量,pat 嵌套在 gp 中。由于结果是 0/1(转诊给专家是/否),因此合适的模型是多级逻辑回归。

(1)问题:50%的患者只有一次会诊,即没有重复,其他的有2、3到6次会诊。我想知道如何应对这种情况。换句话说:我的团体(患者)只有一次咨询。因此,由于组中唯一的成员,组内是完美的相关性。混合模型框架能解决这个问题吗?

(2) 出现的另一个问题:咨询次数对患者的影响具有重要意义,因为同一个患者的条目与咨询次数一样多。患者咨询的次数越多,考虑的患者特征就越多。如果所有患者的咨询次数都相同,情况就不会如此。

感谢每一个帮助和提示。

更新:
为了简化分析,我可以汇总患者级别:如果患者有多次咨询并且至少有一次咨询有 1,那么患者的结果为 1,否则为 0。然后我有一个更简单的模型:

y ~ gp_sex + pat_sex + pat_age + (1|gp)

在这种情况下,问题 (1) 将过时,但我仍然遇到问题 (2),因为每个 gp 有不同数量的患者。

3个回答

如果没有真正了解你的结果y是很难的,但我会尽力而为。

(1) 这听起来可能近似于 λ=1 泊松分布。除非您看到它弄乱了模型的方差分量,否则我不会担心。如果是,我会尝试通过sqrt(cons_x) 链接对其进行转换,看看是否效果更好。不要忘记通过在最终模型中插入一些示例来检查模型的敏感性,改变咨询次数,看看它是否有意义。

(2) 听起来需要添加交互变量才能看到咨询对性别和年龄的实际影响。

y ~ gp_sex + pat_sex + pat_age + cons_x + cons_x*pat_sex + cons_x*pat_age + cons_x*pat_age*pat_sex + ....

我只能根据经验使用模拟来回答我的问题。使用这两个混合逻辑的交叉验证贡献,我可以创建一些假数据集并使用混合逻辑回归。使用 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)

我当然不是专家,并且希望其他人对此发表评论,但是:

我不确定你的结果是什么,但你说它是 1/0 测量的。为了这个例子,我会假装你的结果是“对咨询感到满意”yes=1 和 No=0。

我认为对于多次咨询的人来说,你的任务更容易。您可以根据每个人的多次咨询计算出每个人的满意反应比例(例如,第 1 个人进行了 6 次咨询,满意 3 次,不满意 3 次 = 50% 满意)。然后,您可以通过将每个人的幸福百分比相加并除以人数来计算所有人的“总体”平均幸福感。然后你会得到一个“总体平均快乐百分比”的衡量标准。你也会得到一个围绕这个整体 % 的标准错误。您现在基本上有了可以在测试或其他基于正态分布的测量中分析的数据。

如果您没有重复此人,则无法执行此操作。你能做的最好的就是在所有参与者中找出一定比例的快乐反应。假设您有 4 个参与者,他们只有 1 次咨询(p1 很高兴=1 p2 很高兴=1,p3=1 和 p4=0),所以高兴的比例是 75%。您现在必须使用二项式测试,例如 az test - 我认为它没有那么强大(我刚刚发布了一个关于此的问题)。

您可能必须分别分析您的数据中的无重复和重复。不幸的是,您不能假装重复的数据来自不同的人,因为这会违反独立性假设,所以我觉得重复测量与没有重复测量数据需要不同的方法。