如何为事件序列计算P值?R语言重复样本数据处理求助
为数据集添加P值的技术方案
你的数据中每个Accession对应Rep1、Rep2两个重复样本,针对First、Condition1、Condition2这三个指标,可通过以下步骤计算并添加P值,同时整合你已有的中位数、统计量结果:
核心思路
按Accession分组,对每个数值指标做两样本统计检验(根据数据分布选t检验或Wilcoxon秩和检验)得到P值,再将P值与你已有的统计量结果合并。
具体代码实现
1. 计算每个指标的P值
# 加载必要包 library(dplyr) library(tidyr) # 方式1:参数检验(t检验,适用于数据符合正态分布的情况) p_value_df <- df %>% group_by(Accession) %>% summarise( across(where(is.numeric), ~ t.test(.x ~ grp)$p.value, .names = "{col}_pval"), .groups = "drop" ) # 方式2:非参数检验(Wilcoxon秩和检验,适用于数据偏态/不符合正态的情况) # p_value_df <- df %>% # group_by(Accession) %>% # summarise( # across(where(is.numeric), ~ wilcox.test(.x ~ grp)$p.value, .names = "{col}_pval"), # .groups = "drop" # )
2. 修正原有统计量计算逻辑(避免冗余)
你原代码用mutate会生成重复的中位数/SD值,改用summarise按Accession分组计算更合理:
# 计算每个Accession下各指标的中位数、SD summary_stats <- df %>% group_by(Accession) %>% summarise( across(where(is.numeric), list(median = ~median(.x), SD = ~sd(.x)), .names = "{col}_{.fn}"), .groups = "drop" ) # 若需保留Rep1/Rep2各自的统计量(与原代码逻辑一致),用这段: summary_stats_by_rep <- df %>% group_by(Accession, grp) %>% summarise( across(where(is.numeric), list(median = ~median(.x), SD = ~sd(.x)), .names = "{col}_{.fn}"), .groups = "drop" ) %>% pivot_wider(names_from = grp, values_from = matches("First|Condition1|Condition2"))
3. 合并统计量与P值
# 合并汇总型统计量与P值 final_df <- summary_stats %>% left_join(p_value_df, by = "Accession") # 合并分Rep的统计量与P值 final_df_by_rep <- summary_stats_by_rep %>% left_join(p_value_df, by = "Accession")
关键说明
- 检验方法选择:可先通过
shapiro.test()验证数据正态性,符合正态分布则用t检验,否则用Wilcoxon检验。 - 列名规则:代码中
.names参数自动生成如First_pval、Condition1_median的列名,清晰对应各指标的统计量。
内容的提问来源于stack exchange,提问作者nik
相关产品推荐
相关产品推荐

