【问题标题】:R, extracting p-value for each row from t.testR,从 t.test 中提取每一行的 p 值
【发布时间】:2018-08-19 17:45:01
【问题描述】:

我正在尝试对每一行进行 t.test,然后提取 p 值进行绘图。作为参考,我找到了这个旧帖子:output p value from a t-test in R

这是我的 sn-p:

> pVal143<-apply(mRNA143.data, 1, t.test)$p.value

但是当我尝试调用它时,我只返回“NULL”?下面是我的几行数据,仅供参考,谢谢。

       c.mRNA    h.mRNA
1    8.224342  8.520142
2    9.096665 11.762597
3   10.698863 10.815275
4   10.666233 10.972130
5   12.043525 12.140297

使用原始数据集“c007”更新(我需要比较“C”值和 H 值的 p 值)。

                                        C1       C2      C3     C4       C5     C6     H1    H2 H3  H4  H5  H6
NP_000005   P01023  Protein Name    8.57345 8.45938 8.68941 8.35913 8.48177 8.44560 8.40986 8.59392 8.46562 8.07999 8.22759 8.41817
NP_000010   P24752  Protein Name    8.32595 8.19273 8.10708 8.48156 7.99014 8.24859 8.78216 8.59592 8.48299 8.52647 8.34797 8.38534

【问题讨论】:

  • 请在您的问题中添加mRNA143.data 的样本,以使您的问题可重现。最好使用dput(mRNA143.data)
  • 你问过类似的问题heret-每组只有一次观察的测试(我假设您在这种情况下尝试这样做)可能效果不佳(请参阅维基百科上的 t-test为什么理论上这是一个禁忌)。你基本上想做的是t.test(x = 8.224342, y = 8.520142)
  • 以上是 mRNA143.data. 的样本,两列,143 行(我只包括了 5 行)。
  • 拥有多少行并不重要,因为您试图为每个行获取一个 p 值,而这是不可能的。 t 检验需要“理解”数据的分布,并且每组 1 点的 2 组比较没有意义。有意义的是比较一组行,或比较你的 2 列。您提供的链接使用 t.test(1:10, 7:20) 比较具有 10 个值的组 (1:10) 与具有 14 个值的组 (7:20)。
  • 就像@RomanLuštrik 所说,你需要更多的观察。提示:t.test 可以使用 length(x) == length(y) == 2。

标签: r


【解决方案1】:

一种解决方案,您必须手动指定哪些列属于每个组以进行比较:

# example data
df = read.table(text = "
C1       C2      C3     C4       C5     C6     H1    H2 H3  H4  H5  H6
8.57345 8.45938 8.68941 8.35913 8.48177 8.44560 8.40986 8.59392 8.46562 8.07999 8.22759 8.41817
8.32595 8.19273 8.10708 8.48156 7.99014 8.24859 8.78216 8.59592 8.48299 8.52647 8.34797 8.38534
", header=T)

library(tidyverse)

df %>%
  rowwise() %>%
  mutate(pval = t.test(c(C1,C2,C3,C4,C5,C6),
                       c(H1,H2,H3,H4,H5,H6))$p.value) %>%
  ungroup()

# # A tibble: 2 x 13
#      C1    C2    C3    C4    C5    C6    H1    H2    H3    H4    H5    H6   pval
#   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>
# 1  8.57  8.46  8.69  8.36  8.48  8.45  8.41  8.59  8.47  8.08  8.23  8.42 0.161 
# 2  8.33  8.19  8.11  8.48  7.99  8.25  8.78  8.60  8.48  8.53  8.35  8.39 0.0110

另一种解决方案,您可以重塑数据并从每列的第一个字母创建 2 个组:

df %>%
  mutate(id = row_number()) %>%                 # add row id
  gather(key, value, -id) %>%                   # reshape dataset
  mutate(key = substr(key,1,1)) %>%             # create a group column from first letter (will be used for the t.test comparison)
  group_by(id) %>%                              # for each row
  summarise(pval = t.test(value ~ key)$p.value) # get p value 

# # A tibble: 2 x 2
#      id   pval
#   <int>  <dbl>
# 1     1 0.161 
# 2     2 0.0110

【讨论】:

  • 我能够执行您的代码 - 非常感谢:&gt; pvals.007&lt;-x007 %&gt;% + rowwise() %&gt;% + mutate(pval = t.test(c(C1,C2,C3,C4,C5,C6), + c(H1,H2,H3,H4,H5,H6))$p.value) %&gt;% + ungroup() &gt; plot(pvals.007)。当我绘制它时,我期待每行的 p 值散点图(比较 C1-6 和 H1-6),但我得到了 143 个小垂直标记?我也无法创建直方图,因为我收到错误:“x”必须是数字?
  • pvals.007 是一个数据框,而不是 (143) 个 p 值的向量。尝试使用pvals.007$pval,因为这是存储所有 p 值的列。
  • 非常感谢 - 我真的很感激!我会将您的回复标记为“已回答”,但我没有声誉积分。艰难的人群:-)
  • 别担心。关键是要学习一些你可以在未来在类似情况下使用的东西:)
  • 我也在尝试运行 t.test variances = FALSE 的版本,对于代码中的 mutate 步骤,我尝试了以下操作,但出现错误:mutate(pval = t.test(var.equal = FALSE(c(C1,C2,C3,C4,C5,C6),跨度>
猜你喜欢
  • 1970-01-01
  • 2013-10-12
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2016-11-01
  • 2019-02-17
  • 2018-02-07
相关资源
最近更新 更多