You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何R脚本与手动计算的行t检验p值结果不一致?

问题解析与修正

问题根源

你的代码里犯了一个逻辑错误:在apply的匿名函数中,df[, 7:13]取的是整个数据框后7列的所有行数据,而非当前行的后7个数值。

举个实际例子,当处理第一行(Gene1)时,row确实是第一行的前5个值c(1,4,4,0,-1),但df[,7:13]是3行×7列的完整数据集(共21个值),相当于拿第一行的5个值和全部3行的21个值做t检验,这和你手动执行的“仅第一行前后两组数据对比”完全不是一回事,自然p值差异巨大。

修正后的代码

方法1:基于apply的逐行处理

直接对除Assay外的所有列逐行处理,拆分当前行的前后两组数据:

p_values <- apply(df[, -1], 1, function(row) {
  group1 <- row[1:5]  # 当前行前5个值
  group2 <- row[6:12] # 当前行后7个值
  t.test(group1, group2)$p.value
})

df$p_values <- p_values

方法2:用dplyr的行级处理(更易读)

如果习惯tidyverse语法,用rowwise可以更直观地完成逐行计算:

library(dplyr)

df <- df %>%
  rowwise() %>%
  mutate(
    p_values = t.test(
      c(DT1, DT2, DT3, DT4, DT5),
      c(DT6, DT7, DT8, DT9, DT10, DT11, DT12)
    )$p.value
  ) %>%
  ungroup()

验证结果

修正后运行代码,第一行的p值会和你手动计算的0.1425完全一致,符合你“逐行对比前后两组数据”的需求。

内容的提问来源于stack exchange,提问作者Lara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:35:13