如何扩展R语言中理论α与经验α的对比代码以支持不同样本量n?
如何扩展R语言中理论α与经验α的对比代码以支持不同样本量n?
看起来你已经搞定了单样本量下理论α和经验α的对比,现在想把代码改成支持多个样本量的版本对吧?我先帮你捋捋现有代码里的几个小问题,再给你调整成通用版本~
先说说你现有扩展代码里的小坑
- 样本量的定义问题:如果要测试多个n,得把
n定义成向量,比如n <- c(10,20,30),而不是单个数值20; - 样本抽取的错误:你代码里的
muestra <- poblacion[sample(1:N, length(n))]用了length(n),这会取你n向量的长度(比如n是c(10,20)的话,length(n)是2),而不是当前循环的样本量,应该改成用循环变量; - 结果存储不清晰:用空向量
z存储结果太零散,用数据框来存每个n对应的经验α会更结构化,方便后续查看和分析; - 可选优化:每次循环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])) }
代码关键点解释
- 样本量向量:
n_values可以随便加你想测试的样本量,比如c(5,15,25)都可以; - 结果数据框:
result_df会把每个样本量的理论α、经验α都存起来,后续想分析或画图都很方便; - 总体生成:把总体放在循环外,是为了让所有样本量都基于同一个总体做检验,结果对比更公平;如果需要每个样本量对应不同的模拟总体,把
poblacion <- rnorm(...)和mu_poblacion <- mean(...)移到for (current_n in n_values)循环里面就行; - 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
相关产品推荐
相关产品推荐

