【问题标题】:Computing weights for multi-site RCT计算多站点 RCT 的权重
【发布时间】:2014-09-01 16:09:27
【问题描述】:

假设一个多中心 RCT 有两组——实验组和对照组。需要为每个时间段和站点计算权重。我将实验对象的权重固定为 1,然后计算控制对象的权重,使对照组权重的总和等于实验组权重的总和(对于每个时间段和站点)。下面是生成假设数据集的代码:

set.seed(13458) # Set random seed
ID <- c(1:20)  # Generate 20 unique subject IDs 
timePeriod <- c(rep(1, 3), rep(2, 6), rep(3, 11)) # Generate time periods
site <- c(rep("A", 3), rep("B", 6), rep("C", 11)) # Generate sites
group <- sample(c("exp", "cont"), 20, replace = TRUE) # Random assignment
outcome <- sample(c(rep(0,75), 0:100), 20, replace = TRUE) # Generate outcomes 
DF <- data.frame(ID, timePeriod, site, group, outcome) # Create a data frame

然后输出:

head(DF)
    ID timePeriod site group outcome
1   1          1    A  cont      12
2   2          1    A  cont      37
3   3          1    A   exp      59
4   4          2    B   exp       0
5   5          2    B  cont       0
6   6          2    B   exp       0
7   7          2    B  cont       0
8   8          2    B   exp      22
9   9          2    B   exp      34
10 10          3    C  cont      26

这是一个相当笨拙的策略,用于计算每个时间段和站点的实验对象和对照对象的权重。

library(plyr)
a <- ddply(DF, c("timePeriod", "site", "group"), function(x){
     countSubjects <- length(x$group)
     data.frame(N = countSubjects)     
     })

a$weight <- rep(NA, nrow(a)) for(i in 1:nrow(a))
     {
     n <- a$N[i+1]
     d <- a$N[i]
     weight <- n/d
     a$weight[i] <- ifelse(a$group[i] == "cont", weight, 
                         ifelse(a$group[i] == "exp", 1, a$ratio))
     }

> print(a)
  timePeriod site group N weight
1          1    A  cont 2    0.5
2          1    A   exp 1    1.0
3          2    B  cont 2    2.0
4          2    B   exp 4    1.0
5          3    C  cont 5    1.2
6          3    C   exp 6    1.0
> 

如何使用这些权重来计算调整后的结果(即,将每个受试者的结果乘以时间段、地点和组的相应权重)?我的兴趣是将计算的权重和调整后的结果添加到原始数据框中。 (这里是调整结果的一个例子。)

ID 1:  12 * .5 = 6
ID 2:  37 * .5 = 18.5
ID 3:  59 * 1 = 59 
ID 4:  0 * 1 = 0
…
ID 8:  22 * 1 = 22
…
ID 10: 26 * 1.2 = 31.2

【问题讨论】:

    标签: r plyr weighted-average


    【解决方案1】:

    使用 dplyr 可以这样做:

    tmp <- DF %>% group_by(timePeriod, site, group) %>% mutate(N=n(), outcome)
    tmp %>% group_by(timePeriod, site) %>% 
      arrange(group) %>%
      mutate(weight=ifelse(group=="cont", last(N)/first(N), last(N)/last(N)),
             adjusted=outcome*weight )
    

    【讨论】:

    • 感谢您的快速反馈。加载 dplyr 库后,我运行代码并收到错误“找不到函数“%>%””。关于为什么会发生这种情况的任何想法?
    • 你使用哪个版本的 dplyr 库?
    • 我刚刚更新到新的:dplyr_0.2。更新后,错误信息是“期望单个值”。
    • 我看到加载 plyr 和 dplyr 的顺序存在依赖性问题。在订购它 plyr 然后 dplyr 后,错误是:“n() 中的错误:不应直接调用此函数。”
    • detach("package:plyr", unload=TRUE)
    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    相关资源
    最近更新 更多