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

如何绘制符号检验(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")

关键结论

  1. 当M=0(原假设为真)时,两种检验的功效接近显著性水平α(0.05),符合第一类错误率的定义;
  2. 当M>0(备择假设为真)时,随着M增大,两种检验的功效快速上升,说明偏移越大,越容易检测到差异;
  3. 当M<0时,功效维持在α附近,因为此时备择假设不成立,拒绝原假设的概率就是第一类错误率;
  4. 符号秩检验的功效整体高于符号检验,因为它利用了数据的秩信息,比仅依赖符号的符号检验更高效。

内容的提问来源于stack exchange,提问作者John hall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:52:09