【问题标题】:Calculate p-values in a for loop在 for 循环中计算 p 值
【发布时间】:2017-05-07 07:16:51
【问题描述】:

我有一个包含实验数据的数据集。 每天我都会收到新的观察结果。

我的 df 与列的虚构示例: 日:日索引 a组:数据控制 b组:数据处理。

structure(list(day = c(1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), group_a = c(4L, 
2L, 3L, 1L, 1L, 4L, 3L, 2L, 4L), group_b = c(3L, 4L, 2L, 2L, 
2L, 2L, 3L, 4L, 5L)), .Names = c("day", "group_a", "group_b"), class = "data.frame", row.names = c(NA, 
-9L))

我想对这个数据集进行子集化,应用 wilcoxon 符号等级测试,例如:

test <- wilcox.test(df$group_a, df$group_b, alternative = 'g')
test$p.value

在本例中,我将测试应用于整个数据集。

我想在第 1 天应用它,然后是第 1 天和第 2 天,依此类推,最后得到一个看起来像(虚构数据)的列表:

day p-value
1   0.02
2   0.03
3   0.3

如何在“天”的 for 循环中应用测试,但在“累积”天数上应用?

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    这也有效:

    library(data.table)
    setDT(df)
    test_pvals <- sapply(as.list(unique(df[, day])), function(x){
      df[day <= x, wilcox.test(group_a, group_b, alternative = 'g')$p.val]
    })
    data.table(day = df[, unique(day)], p.val = test_pvals)
    ##    day     p.val
    ## 1:   1 0.7928919
    ## 2:   2 0.7768954
    ## 3:   3 0.7084401
    

    【讨论】:

    • 不。再次阅读问题
    • 谢谢@Sotos。固定
    【解决方案2】:

    使用:

    for (i in unique(df$day)) {
      df$p.val[df$day == i] <- wilcox.test(df[df$day %in% 1:i,]$group_a, df[df$day %in% 1:i,]$group_b, alternative = 'g')$p.value
    }
    

    你得到:

    > df
      day group_a group_b     p.val
    1   1       4       3 0.7928919
    2   1       2       4 0.7928919
    3   2       3       2 0.7768954
    4   2       1       2 0.7768954
    5   2       1       2 0.7768954
    6   3       4       2 0.7084401
    7   3       3       3 0.7084401
    8   3       2       4 0.7084401
    9   3       4       5 0.7084401
    

    或者当您只想获取汇总数据框中的三个 p 值时:

    vec <- sapply(unique(df$day), 
                  function(i) wilcox.test(df[df$day %in% 1:i,]$group_a, 
                                          df[df$day %in% 1:i,]$group_b,
                                          alternative = 'g')$p.value)
    
    df2 <- data.frame(day = unique(df$day), p.val = vec)
    

    给出:

    > df2
      day     p.val
    1   1 0.7928919
    2   2 0.7768954
    3   3 0.7084401
    

    【讨论】:

      【解决方案3】:

      您可以将Reduceaccumulate = TRUE 一起使用,

      p_value <- do.call(rbind, lapply(Reduce(rbind, split(df, df$day), accumulate = TRUE), 
                     function(i) wilcox.test(i$group_a, i$group_b, alternative = 'g')$p.value))
      p_value
      #          [,1]
      #[1,] 0.7928919
      #[2,] 0.7768954
      #[3,] 0.7084401
      

      整理输出,

      final_df <- data.frame(day = unique(df$day), p_value)
      
      final_df
      #  day   p_value
      #1   1 0.7928919
      #2   2 0.7768954
      #3   3 0.7084401
      

      【讨论】:

        猜你喜欢
        • 2016-12-22
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-02
        • 1970-01-01
        相关资源
        最近更新 更多