如何绘制符号检验(Sign Test)的功效函数?附现有代码求助
符号检验功效函数绘制指南
首先明确:pwr.r.test完全不适用,它是用于Pearson相关系数的功效分析,和符号检验没有任何关系。你应该用power.sign.test(来自pwr包)计算理论功效,或者通过模拟得到实际功效,两种方法均可。
先纠正你当前代码的问题
你现在的代码逻辑有误:对每个M值,生成1000个数据点后只做了一次符号检验,得到的单个p值不是功效。功效的定义是:当备择假设为真时,拒绝原假设的概率——正确的做法是对每个M值,重复N次独立实验,每次实验抽取样本并做检验,统计p值小于显著性水平(比如α=0.05)的次数占总实验次数的比例。
修正后的模拟代码(计算实际功效)
library(BSDA) library(ggplot2) # 参数设置 M_values <- seq(-1, 1, by = 0.1) n_sim <- 1000 # 模拟实验次数 sample_size <- 50 # 每次实验的样本量 alpha <- 0.05 # 显著性水平 # 存储功效的向量 sign_test_power <- numeric(length(M_values)) wilcox_power <- numeric(length(M_values)) # 循环每个M值计算功效 for (i in seq_along(M_values)) { M <- M_values[i] sign_reject <- 0 wilcox_reject <- 0 for (j in 1:n_sim) { # 生成样本:这里沿用你的正态分布逻辑,可保留原上下限处理 sample_data <- rnorm(sample_size, mean = M, sd = 1) lower <- sample_data - 0.01 upper <- sample_data + 0.01 center <- (lower + upper)/2 # 符号检验 sign_result <- SIGN.test(center, md = 0, alternative = "greater") if (sign_result$p.value < alpha) sign_reject <- sign_reject + 1 # 符号秩检验 wilcox_result <- wilcox.test(center, mu = 0, alternative = "greater") if (wilcox_result$p.value < alpha) wilcox_reject <- wilcox_reject + 1 } # 计算功效(拒绝次数/总模拟次数) sign_test_power[i] <- sign_reject / n_sim wilcox_power[i] <- wilcox_reject / n_sim } # 整理结果 results_df <- data.frame( M = rep(M_values, 2), Power = c(sign_test_power, wilcox_power), Test = rep(c("符号检验", "符号秩检验"), each = length(M_values)) )
用power.sign.test计算理论功效
如果你想直接得到理论功效值,可以用pwr包的power.sign.test函数,示例代码:
library(pwr) # 计算每个M值对应的理论功效:正态分布下,P(X>0)=1-pnorm(-M) theoretical_power <- sapply(M_values, function(m) { p <- 1 - pnorm(-m) # 总体中大于0的比例 power.sign.test(n = sample_size, p0 = 0.5, p = p, alternative = "greater")$power })
绘制功效函数
用ggplot2绘制模拟功效和理论功效的对比图:
# 添加理论功效到结果框 results_df <- rbind(results_df, data.frame(M = M_values, Power = theoretical_power, Test = rep("符号检验(理论)", length(M_values)))) ggplot(results_df, aes(x = M, y = Power, color = Test)) + geom_line(size = 1) + geom_hline(yintercept = alpha, linetype = "dashed", color = "gray50") + labs(title = "符号检验与符号秩检验的功效函数", x = "总体中位数偏移M", y = "功效(拒绝原假设的概率)") + theme_minimal() + scale_color_brewer(palette = "Set1")
关键结论
- 当M=0(原假设为真)时,两种检验的功效接近显著性水平α(0.05),符合第一类错误率的定义;
- 当M>0(备择假设为真)时,随着M增大,两种检验的功效快速上升,说明偏移越大,越容易检测到差异;
- 当M<0时,功效维持在α附近,因为此时备择假设不成立,拒绝原假设的概率就是第一类错误率;
- 符号秩检验的功效整体高于符号检验,因为它利用了数据的秩信息,比仅依赖符号的符号检验更高效。
内容的提问来源于stack exchange,提问作者John hall
相关产品推荐
相关产品推荐

