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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:40:08