对数据集中每一行的列进行 t.test

Posted

技术标签:

【中文标题】对数据集中每一行的列进行 t.test【英文标题】:doing t.test for columns for each row in data set 【发布时间】:2015-03-23 01:57:47 【问题描述】:

我有一组数据x,由 12 列和 167 行组成。第一列是每一行的化合物 ID。我想将 3 列作为一组运行 t.test,将其他 3 组作为第二组运行,分别针对每一行。我的代码如下,但它不起作用。

for (i in 1:nrow(x)) 
 function(i)c(compound=i,
    t.test(x[2:4],x[8:10],
      x[x$compound==i, ],
      alternative='two.sided',conf.level=0.95)
    )

print(c(compound=i,t.test(x[2:4],x[8:10],x[x$compound==i,],
    alternative='two.sided',conf.level=0.95)))

我的意图是为 AC 组和 SC 组之间的每种代谢物(化合物)做一个t.test,这是两组细胞。

compound    AC-1     AC-2     AC-3     AM-1      AM-2      AM-3      SC-1     SC-2     SC-3     SM-1      SM-2      SM-3
alanine     27612820 22338050 15359640 19741350  18726880  18510800  10914980 12071660 16036180 16890860  16066960  16364300
arginine    7067206  7172234  5933320  136272600 131596800 134717600 6102838  7186256  6770344  140127100 155341300 151748000
asparagine  3151398  2141378  1240904  11522180  8907711   9842342   1677299  2265826  2942991  11690360  12552660  12102620                        

【问题讨论】:

您想每次都对 3 个值应用 t 检验吗? Neve 只是说“我的代码不起作用”。如果您收到错误,请包含错误消息。如果您没有得到预期的结果,请说出您的预期。此外,您的问题应包括reproducible example,理想情况下应包含示例数据,以便我们可以运行代码并获得与您相同的结果。 对三个简单的项目进行单样本 t 检验没有“统计”意义。代码可能会运行,但结果只是“处理过的废话”。 【参考方案1】:

t.test 用于比较两个数据集。可以像这样从矩阵的三个不同列中收集两个数据集:

data_a = c(x[,2:4])
data_b = c(x[,4:8])

此时可以使用 t.test 评估这两个数据集:

t.test(data_a, data_b)

从给定行(氨基酸)的两种不同化合物的三列中收集数据,我们修改并添加一个循环:

x <- matrix(rnorm(24, mean=0, sd=1), 4, ncol=6)
x
           [,1]       [,2]        [,3]      [,4]       [,5]       [,6]
[1,] -0.4810307  0.3996071  0.90663635 0.7487048  0.5787846  2.0231681
[2,] -2.0454921 -0.1225105 -1.04447522 0.9325333 -1.7782776  0.6856150
[3,] -0.3099937  1.2079548 -0.03835271 0.2751349  1.0111554 -0.4862846
[4,] -0.2834953  0.1930481 -0.57968344 0.1204925 -0.5015843  0.3690397

for(i in 1:nrow(x))
data_a = c(x[i, 1:3])
data_b = c(x[i, 4:6])
print(t.test(data_a, data_b))

【讨论】:

谢谢,但我不知道我应该在循环中还是之前写这些新数据? 从每一行收集三列的数据,你会想要这个在循环中。但一定要包括你想要的行。语法如下所示:data_a = c(x[1,1:2])【参考方案2】:

有了这个假数据:

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
         SM.2        SM.3
1 -0.08419146  0.14275728
2 -1.44965718 -0.64314509
3  0.37673942 -0.07245741
4  0.52794136  1.62305413

您可以执行以下操作来提取(例如)p 值:

library(zoo)
rollapply(t(df[, -1]), function(x) t.test(x)$p.value, width = 3, by = 3)
          [,1]      [,2]      [,3]      [,4]
[1,] 0.6308340 0.5702970 0.5783582 0.6468241
[2,] 0.2511564 0.8327439 0.1617192 0.2005518
[3,] 0.9026407 0.4309623 0.4156030 0.6441069
[4,] 0.3878145 0.4909217 0.6239915 0.2747601

【讨论】:

【参考方案3】:
x$stat <- sapply(1:nrow(x), function(i) t.test(as.numeric(as.character(unlist(x[i,2:4]))), as.numeric(as.character(unlist(x[i,8:10]))))[c("p.value")])

【讨论】:

【参考方案4】:

另一种选择是使用包。

您的数据:

df <- rbind(c(27612820, 22338050, 15359640, 19741350, 18726880, 18510800, 10914980, 12071660, 16036180, 16890860, 16066960, 16364300),
        c(7067206, 7172234, 5933320, 136272600, 131596800, 134717600, 6102838, 7186256, 6770344, 140127100, 155341300, 151748000),
        c(3151398, 2141378, 1240904, 11522180, 8907711, 9842342, 1677299, 2265826, 2942991, 11690360, 12552660, 12102620)
        )

df <- data.frame(df)
rownames(df) <- c("alanine", "arginine", "asparagine")
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")

然后对 AC 和 SC 组之间的每一行进行 t 检验:

library(matrixTests)
> row_t_welch(df[,c("AC-1", "AC-2", "AC-3")], df[,c("SC-1", "SC-2", "SC-3")])
           obs.x obs.y obs.tot   mean.x   mean.y mean.diff          var.x         var.y    stderr       df   statistic    pvalue conf.low conf.high alternative mean.null conf.level
alanine        3     3       6 21770170 13007607 8762563.3 37776970798900 7213669482133 3872580.5 2.736945  2.26271945 0.1171389 -4259692  21784819   two.sided         0       0.95
arginine       3     3       6  6724253  6686479   37774.0   471939373529  298723602417  506840.9 3.807645  0.07452832 0.9443398 -1397926   1473474   two.sided         0       0.95
asparagine     3     3       6  2177893  2295372 -117478.7   913496858185  401148784303  661978.3 3.472571 -0.17746605 0.8690016 -2070931   1835973   two.sided         0       0.95

【讨论】:

以上是关于对数据集中每一行的列进行 t.test的主要内容,如果未能解决你的问题,请参考以下文章

如何对 Spark 数据集中的列进行舍入?

如何将一行与 spark 数据集中的所有其他行进行比较?

数据库视频对游标的认识

遍历 JDBC 模板的 ResultSetExtractor 而不保留对对象的引用(大数据集)?

sql 游标如何循环

SQL Server游标