两组观察值之间的成对差异

时间:2020-04-01 19:21:45

标签: r pairwise-distance

我的数据集中有两个治疗组,我正在寻找一种快速的方法来计算第一组和第二组中观察值之间的成对差异。

如何快速创建观察的所有组合并加以区别?

我认为我可以像这样通过使用expand.grid来获得主题ID的组合...

expand.grid(df$subjectID[df$treatment == 'Active'],
            df$subjectID[df$treatment == 'Placebo'])

,然后我可以基于主题ID加入结果值并加以区别。我希望有一种更通用的方法,如果可以的话。

我基本上是从头开始计算Mann-Whitney U统计量,因此我需要确定活跃治疗组的结果值是否大于安慰剂组的结果值(Y_a-Y_p> 0)。换句话说,我需要将积极治疗组中的每个反应与安慰剂治疗组中的每个反应进行比较。

所以,如果我有一些看起来像这样的数据...

Subject Treatment   Outcome
1       Active      5
2       Active      7
3       Active      6
4       Placebo     2
5       Placebo     1

我要计算差异矩阵...

    S4  S5
S1  5-2 5-1
S2  7-2 7-1
S3  6-2 6-1

以下是一些真实数据:

structure(list(subjectID = c(342L, 833L, 347L, 137L, 111L, 1477L
), treatment = c("CC + TV", "CC + TV", "CC + TV", "Control", 
"Control", "Control"), score_ch = c(2L, 3L, 2L, 3L, 0L, 0L)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

我通过以下方式获得了想要的结果:

diff_df <- expand.grid('T_ID' = df$subjectID[df$treatment == 'CC + TV'],
            'C_ID' = df$subjectID[df$treatment == 'Control'])

tttt <- diff_df %>%
  left_join(df %>% select(subjectID, score_ch), by = c('T_ID' = 'subjectID')) %>%
  left_join(df %>% select(subjectID, score_ch), by = c('C_ID' = 'subjectID')) %>%
  mutate(val = case_when(score_ch.x == score_ch.y ~ 0.5,
                         score_ch.x > score_ch.y ~ 1,
                         score_ch.x < score_ch.y ~ 0))

但是那种..糟透了..

1 个答案:

答案 0 :(得分:1)

使用基数R outer怎么样?

Result <- outer(df[df$treatment == "Control",3],df[!df$treatment == "Control",3], FUN = '-')
colnames(Result) <- df[df$treatment == "Control","subjectID"]
rownames(Result) <- df[!df$treatment == "Control","subjectID"]
Result
#    137 111 1477
#342   1   0    1
#833  -2  -3   -2
#347  -2  -3   -2