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

如何扩展R语言中理论α与经验α的对比代码以支持不同样本量n?

如何扩展R语言中理论α与经验α的对比代码以支持不同样本量n?

看起来你已经搞定了单样本量下理论α和经验α的对比,现在想把代码改成支持多个样本量的版本对吧?我先帮你捋捋现有代码里的几个小问题,再给你调整成通用版本~

先说说你现有扩展代码里的小坑

  1. 样本量的定义问题:如果要测试多个n,得把n定义成向量,比如n <- c(10,20,30),而不是单个数值20;
  2. 样本抽取的错误:你代码里的muestra <- poblacion[sample(1:N, length(n))]用了length(n),这会取你n向量的长度(比如n是c(10,20)的话,length(n)是2),而不是当前循环的样本量,应该改成用循环变量;
  3. 结果存储不清晰:用空向量z存储结果太零散,用数据框来存每个n对应的经验α会更结构化,方便后续查看和分析;
  4. 可选优化:每次循环n都重新生成总体poblacion其实没必要,把总体生成放在循环外面,能减少随机波动的影响,当然如果你想模拟不同总体,再移回循环内就行。

修正后的通用版本代码

下面是调整好的代码,支持任意多个样本量,还做了结果结构化的优化:

set.seed(1) # 固定随机种子,保证结果可复现
N <- 1000   # 模拟的总体大小
k <- 500    # 每个样本量下重复t检验的次数
n_values <- c(10, 20, 30, 40) # 你要测试的所有样本量,想加就加
a_teo <- 0.05 # 理论显著性水平α

# 初始化结果数据框,用来存每个样本量的对比结果
result_df <- data.frame(
  样本量n = integer(),
  理论α = numeric(),
  经验α = numeric(),
  stringsAsFactors = FALSE
)

# 先生成一次总体(如果要每个n对应不同总体,把这段移到下面的循环里)
poblacion <- rnorm(N, 10, 10)
mu_poblacion <- mean(poblacion)

# 循环遍历每个样本量
for (current_n in n_values) {
  # 初始化向量存k次检验的p值
  p_values <- vector(length = k)
  
  # 重复k次t检验
  for (j in 1:k) {
    # 从总体中抽取当前样本量的样本
    muestra <- poblacion[sample(1:N, current_n)]
    # 做单样本t检验,提取p值
    p_values[j] <- t.test(muestra, mu = mu_poblacion)$p.value
  }
  
  # 计算当前样本量下的经验α
  a_emp <- sum(p_values < a_teo) / k
  
  # 把结果添加到数据框里
  result_df <- rbind(result_df, data.frame(
    样本量n = current_n,
    理论α = a_teo,
    经验α = a_emp
  ))
}

# 打印结构化的结果
print(result_df, digits = 3)

# 也可以用格式化的方式逐个输出对比
cat("\n格式化输出对比结果:\n")
for (i in 1:nrow(result_df)) {
  cat(sprintf("样本量n=%d: 理论α=%.3f <-> 经验α=%.3f\n",
              result_df$样本量n[i],
              result_df$理论α[i],
              result_df$经验α[i]))
}

代码关键点解释

  1. 样本量向量:n_values可以随便加你想测试的样本量,比如c(5,15,25)都可以;
  2. 结果数据框:result_df会把每个样本量的理论α、经验α都存起来,后续想分析或画图都很方便;
  3. 总体生成:把总体放在循环外,是为了让所有样本量都基于同一个总体做检验,结果对比更公平;如果需要每个样本量对应不同的模拟总体,把poblacion <- rnorm(...)和mu_poblacion <- mean(...)移到for (current_n in n_values)循环里面就行;
  4. p值统计:用sum(p_values < a_teo)代替length(p[p < a_teo]),效果完全一样,但代码更简洁。

可选:把结果可视化(更直观)

如果想更直观地看不同样本量下经验α的变化,可以加个ggplot2的可视化代码:

# 先安装ggplot2(如果没装过的话)
# install.packages("ggplot2")
library(ggplot2)

ggplot(result_df, aes(x = 样本量n, y = 经验α)) +
  geom_point(size = 3, color = "#1f77b4") + # 画每个样本量的经验α点
  geom_hline(yintercept = a_teo, color = "#ff4d4d", linetype = "dashed") + # 理论α的参考线
  labs(
    x = "样本量n",
    y = "经验显著性水平α",
    title = "不同样本量下理论α与经验α的对比",
    subtitle = sprintf("理论α = %.3f", a_teo)
  ) +
  theme_bw() +
  ylim(0, 0.1) # 限制y轴范围,更聚焦

这样运行后,你就能看到每个样本量对应的经验α和理论α的差距,非常直观~

备注:内容来源于stack exchange,提问作者BehSci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 11:28:20