如何修改Shapiro检验R代码实现不同样本量下Bonett检验模拟
问题原因&修改方案
你的代码存在三处核心错误,逐一修正即可:
- 检验逻辑错误:Bonett检验和Shapiro检验的拒绝逻辑完全一致,都是p值小于显著性水平α=0.05时拒绝正态性原假设,你写的
!= sqrt(2/pi)是完全错误的判断条件,直接替换为<0.05即可。 - 返回值提取错误:
moments包的bonett.test()返回的htest类对象中,p值直接存储在p.value字段,不需要用矩阵索引["p.value",]提取,直接用$p.value调用即可。 - 括号配对错误:原代码中函数体、
replicate、table的括号没有正确闭合,导致R解析语法时出现unexpected symbol报错。
修正后可运行代码
library(moments) out <- t(sapply(c(10, 20, 50, 100), function(x) { # 重复1000次检验,统计p<0.05的频次 table(replicate(1000, bonett.test(rnorm(x))$p.value < 0.05)) })) row.names(out) <- c(10, 20, 50, 100) out
输出结果示例(随机模拟结果会有小幅波动,符合统计预期)
| 样本量 | FALSE | TRUE |
|---|---|---|
| 10 | 948 | 52 |
| 20 | 955 | 45 |
| 50 | 947 | 53 |
| 100 | 952 | 48 |
内容的提问来源于stack exchange,提问作者Daniel James
相关产品推荐
相关产品推荐

