如何将R语言中模拟t检验的结果转换为dataframe?
问题描述
我尝试通过R语言模拟操作加深对统计检验的理解,希望模拟t检验结果并探究估计值、p值等指标的变异情况。我已经完成模拟,但输出结果是复杂列表,无法将其转换为简单的dataframe(或tibble),恳请各位提供帮助。
我的代码
library(tidyverse) library(broom) popul1 <- rnorm(1000, 5, 2) popul2 <- rnorm(1000, 3, 2) t.test.fun <- function(size) { samp1 <- sample(popul1, size = size, replace = TRUE) samp2 <- sample(popul2, size = size, replace = TRUE) dat <- tibble(group = rep(c("group1", "group2"), each = size), value = c(samp1, samp2)) tidy(t.test(value~group, dat)) } t.test.fun(10) sims <- replicate(1000, t.test.fun(10), simplify = TRUE) sims1 <- t(sims) %>% as_tibble() str(sims1) ggplot(sims1, aes(p.value)) + geom_density()
解决方案
问题根源在于replicate的simplify=TRUE参数——它会把每次t.test.fun返回的tibble强制转换成矩阵,导致后续转成tibble时结构混乱。只需调整参数并改用bind_rows合并结果即可:
修改后的代码:
library(tidyverse) library(broom) popul1 <- rnorm(1000, 5, 2) popul2 <- rnorm(1000, 3, 2) t.test.fun <- function(size) { samp1 <- sample(popul1, size = size, replace = TRUE) samp2 <- sample(popul2, size = size, replace = TRUE) dat <- tibble(group = rep(c("group1", "group2"), each = size), value = c(samp1, samp2)) tidy(t.test(value~group, dat)) } # 关闭自动简化,保留tibble列表结构 sims <- replicate(1000, t.test.fun(10), simplify = FALSE) # 将所有tibble按行合并为一个完整数据集 sims_df <- bind_rows(sims) # 查看合并后的数据结构 str(sims_df) # 绘制p值密度图 ggplot(sims_df, aes(p.value)) + geom_density()
关键说明:
simplify=FALSE让replicate返回由1000个独立tibble组成的列表,每个tibble对应一次t检验的结构化结果(即tidy()输出的所有指标)。bind_rows()可以直接将列表中的所有tibble合并成单一的tibble,包含estimate、p.value等所有你需要分析的字段,方便后续的统计分析和可视化。
内容的提问来源于stack exchange,提问作者linda
相关产品推荐
相关产品推荐

