【问题标题】:R run T-test/anova for each row with 2 groups with 3 samplesR 为每行运行 T 检验/方差分析,每行有 2 组,有 3 个样本
【发布时间】:2018-12-14 05:41:18
【问题描述】:

我的数据集如下所示:

df <- data.frame(compound = c("alanine ", "arginine", "asparagine", "aspartate"))
df <- matrix(rnorm(12*4), ncol = 12)
colnames(df) <- c("AC-1", "AC-2", "AC-3", "AM-1", "AM-2", "AM-3", "SC-1", "SC-2", "SC-3", "SM-1", "SM-2", "SM-3")
df <- data.frame(compound = c("alanine ", "arginine", "asparagine", "aspartate"), df)
 df
compound        AC.1        AC.2       AC.3       AM.1       AM.2            AM.3       SC.1       SC.2       SC.3         SM.1
1   alanine   1.18362683 -2.03779314 -0.7217692 -1.7569264 -0.8381042      0.06866567  0.2327702 -1.1558879  1.2077454  0.437707310
2   arginine -0.19610110  0.05361113  0.6478384 -0.1768597  0.5905398     -0.67945600 -0.2221109  1.4032349  0.2387620  0.598236199
3 asparagine  0.02540509  0.47880021 -0.1395198  0.8394257  1.9046667      0.31175358 -0.5626059  0.3596091 -1.0963363 -1.004673116
4  aspartate -1.36397906  0.91380826  2.0630076 -0.6817453 -0.2713498     -2.01074098  1.4619707 -0.7257269  0.2851122 -0.007027878

我想对 [2:4] 列和 [5:7] 列上的每一行(复合)执行 t 检验,并存储所有 p 值。基本上看每个化合物的AC组和AM组有没有区别。

我知道还有另一个主题,但是我找不到解决我的问题的可行解决方案。

PS。我的真实数据集大约有 35000 行(也许它需要与只有 4 行不同的解决方案)

【问题讨论】:

  • 6 之后的列呢
  • @akrun,这些无关紧要,只比较2组

标签: r statistics bioinformatics t-test


【解决方案1】:

如果可以使用外部库:

library(matrixTests)

row_t_welch(df[,2:4], df[,5:7])$pvalue
[1] 0.67667626 0.39501003 0.26678161 0.01237438

【讨论】:

    【解决方案2】:

    选择感兴趣的列后,使用pmap 在每一行上应用t.test,方法是选择前3 个和后3 个观察作为t.testbind 的输入,将提取的“p 值”作为另一个原始数据中的列

    library(tidyverse)
    df %>% 
      select(AC.1:AM.3) %>%
      pmap_dbl(~ c(...) %>%
                   {t.test(.[1:3], .[4:6])$p.value}) %>% 
      bind_cols(df, pval_AC_AM = .)
    

    或者在选择列后,执行gather 转换为“长”格式,spread,在summarise 中应用t.test 并与原始数据连接

    df %>%
      select(compound, AC.1:AM.3) %>% 
      gather(key, val, -compound) %>% 
      separate(key, into = c('key1', 'key2')) %>%
      spread(key1, val) %>% 
      group_by(compound) %>%
      summarise(pval_AC_AM = t.test(AC, AM)$p.value) %>% 
      right_join(df)
    

    更新

    如果存在只有唯一值的情况,则t.test 会显示错误。一种选择是运行t.test 并在这些情况下获得 NA。这可以通过possibly来完成

    posttest <- possibly(function(x, y) t.test(x, y)$p.value, otherwise = NA)
    df %>% 
      select(AC.1:AM.3) %>%
      pmap_dbl(~ c(...) %>%
                   {posttest(.[1:3], .[4:6])}) %>% 
      bind_cols(df, pval_AC_AM = .)
    
    posttest(rep(3,5), rep(1, 5))
    #[1] NA
    

    【讨论】:

    • 我收到第一个错误 UseMethod("select_") 中的错误:没有适用于 'select_' 的方法应用于类“c('matrix', 'double', '数字')"
    • @NathanWeesie 您将数据显示为data.frame,而错误提示您有matrix。请检查您的原始数据的str(df)。如果是矩阵,则转换为 data.frame 即as.data.frame(df)
    • 啊,你是对的!现在我得到了这个错误,虽然 t.test.default(.[1:3], .[4:6]) 中的错误:数据基本上是恒定的
    • @NathanWeesie 这是您数据中的问题,即t.test(rep(3, 5), rep(1, 5)) 您可能需要一个条件来检查或使用possibly
    • @NathanWeesie 请检查更新。我认为它现在应该可以工作了
    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 2014-05-01
    • 2020-09-05
    • 1970-01-01
    • 2020-06-25
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多