You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历两因子水平所有组合,填充评审者一致性百分比矩阵?

嘿,我来帮你搞定这个评审者一致率矩阵的填充问题!结合你描述的数据集特点,我给你分步骤拆解实现方案,用基础R和dplyr两种方式都能搞定:

先理清核心逻辑

我们的目标是计算每对评审者在共同评估的患者中,结局一致的次数百分比,并填充到矩阵的下半三角(主对角线下方)。因为每个患者有3位评审者,所以每对评审者会在多个患者的评审组合中出现,我们需要统计这些场景下的一致率。

方案1:基础R实现

假设你的结局变量名为outcome,先按以下步骤来:

# 1. 获取所有评审者的唯一值,确认顺序是a-f
revs <- c("a", "b", "c", "d", "e", "f") # 或者用unique(dta$reviewer)自动获取
n_revs <- length(revs)

# 2. 创建带维度名称的空矩阵
agree_mat <- matrix(NA, nrow = n_revs, ncol = n_revs, dimnames = list(revs, revs))

# 3. 遍历下半三角的所有评审者组合(行索引 > 列索引)
for (i in 2:n_revs) {
  for (j in 1:(i-1)) {
    # 取出当前要计算的一对评审者
    rev_row <- revs[i]
    rev_col <- revs[j]
    
    # 筛选出包含这两个评审者的患者数据,且每个患者必须同时有两人的记录
    pair_data <- dta[dta$reviewer %in% c(rev_row, rev_col), ]
    valid_ptids <- names(which(table(pair_data$ptid) == 2))
    valid_data <- pair_data[pair_data$ptid %in% valid_ptids, ]
    
    # 统计每对患者中两人结局是否一致
    ptid_agree <- tapply(valid_data$outcome, valid_data$ptid, function(x) x[1] == x[2])
    agree_pct <- (sum(ptid_agree) / length(ptid_agree)) * 100
    
    # 填充矩阵对应位置,保留两位小数
    agree_mat[i, j] <- round(agree_pct, 2)
  }
}

# 如果需要,给对角线(评审者自评)填充100%
diag(agree_mat) <- 100

方案2:用dplyr简化代码

如果你习惯用tidyverse风格,这段代码更简洁:

library(dplyr)

# 1. 定义评审者列表
revs <- c("a", "b", "c", "d", "e", "f")

# 2. 创建空矩阵
agree_mat <- matrix(NA, nrow = length(revs), ncol = length(revs), dimnames = list(revs, revs))

# 3. 生成所有无序评审者对,计算每对的一致率
pair_agree <- combn(revs, 2, simplify = FALSE) %>%
  lapply(function(pair) {
    dta %>%
      filter(reviewer %in% pair) %>%
      count(ptid) %>%
      filter(n == 2) %>%
      pull(ptid) %>%
      {dta %>% filter(ptid %in% ., reviewer %in% pair)} %>%
      group_by(ptid) %>%
      summarize(agree = first(outcome) == last(outcome)) %>%
      summarize(pct = mean(agree) * 100) %>%
      mutate(rev1 = pair[1], rev2 = pair[2])
  }) %>%
  bind_rows()

# 4. 将计算结果填充到矩阵下半三角
for (row in 1:nrow(pair_agree)) {
  rev_col <- pair_agree$rev1[row]
  rev_row <- pair_agree$rev2[row]
  agree_mat[rev_row, rev_col] <- round(pair_agree$pct[row], 2)
}

# 填充对角线
diag(agree_mat) <- 100

关键细节说明

  • 代码里的valid_ptids是为了确保我们只统计同时有两位评审者参与评估的患者,避免因数据异常导致错误计算。
  • 如果你的矩阵“下半部分”是指主对角线及以下,只需把循环范围调整为i从1到n_revs,j从1到i即可,对角线直接设为100%。
  • 你之前能手动填充[a,b]位置,现在这段代码会自动遍历所有需要的组合,不用一个个手动计算啦!

内容的提问来源于stack exchange,提问作者user2230555

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:30:30