R按物种分组开展性别比中位数符号检验的报错解决方法
报错原因
dplyr::summarise()要求分组计算的每一列输出为长度1的原子向量,不支持复杂列表类型的返回值。DescTools::SignTest()返回的是htest类的列表对象,包含检验方法、统计量、p值、置信区间等多个字段,不是单值向量,直接传入会触发类型报错。
可直接运行的修正代码
# 加载依赖包 library(DescTools) library(dplyr) # 读取数据 data <- read.csv(file.choose()) df <- data.frame( Species = data$IOC_species, SR = data$SR ) # 分组计算目标统计量 sumstats <- df %>% group_by(Species) %>% summarise( n = n(), # 统计每个物种对应的母本样本量 medianSR = median(SR, na.rm = TRUE), # 计算性别比中位数,自动跳过缺失值 p_sign = SignTest(SR, mu = 0.5)$p.value, # 从符号检验结果中提取p值 .groups = "drop" ) # 可选:过滤样本量过小、检验结果无参考意义的物种(比如保留样本量≥5的物种) # sumstats <- sumstats %>% filter(n >= 5) # 查看结果前6行 head(sumstats)
结果说明
- 最终输出的
sumstats表包含所有需要的字段:物种名Species、性别比中位数medianSR、样本量n、符号检验p值p_sign。 - 代码中添加了
na.rm = TRUE参数,避免数据中存在缺失值导致中位数计算返回NA。 - 若某物种所有母本的SR值全为0.5、或样本量为1,符号检验会返回NA,属于正常情况,这类结果无统计检验效力,可通过过滤样本量阈值的方式剔除。
- 若需要做多重检验校正,可在summarise后添加
mutate(p_adj = p.adjust(p_sign, method = "fdr"))生成校正后的p值列。
内容的提问来源于stack exchange,提问作者Julia
相关产品推荐
相关产品推荐

