加权Kruskal-Wallis测试报错:IndependenceProblem类对象无效
问题:加权Kruskal-Wallis测试报错
IndependenceProblem无效 你遇到的错误信息:
Error in kruskal_test: Error in validObject(.Object): invalid class “IndependenceProblem” object: FALSE
错误原因
- 未取消行分组状态:生成
pt_tot后,数据集仍保留rowwise分组,导致后续pivot_longer和nest处理后的数据结构不符合coin::kruskal_test的内部要求,无法正常创建IndependenceProblem对象。 - 不必要的权重归一化:
coin包的kruskal_test接受任意正实数作为观测权重,无需强制归一化到和为1,归一化后的小数权重可能触发内部校验逻辑异常。
解决方法
1. 取消行分组
在生成pt_tot后添加ungroup(),将数据集恢复为普通数据框状态:
punteggi <- punteggi |> group_by(Regione, Genere, Area) |> mutate( mu = runif(1, 4, 7), sd = runif(1, 1, 2), weight = 1/n() ) |> ungroup() |> rowwise() |> mutate(pt_tot = rnorm(1, mu, sd)) |> ungroup() # 新增:取消行分组
2. 移除权重归一化操作
修改测试函数,去掉不必要的权重归一化步骤:
kruskal_per_gruppo <- function(data) { test_result <- tryCatch({ # 移除权重归一化代码 kruskal_test(pt_tot ~ value, data = data, weights = ~ weight) }, error = function(e) { message("Error in kruskal_test: ", e) return(NULL) }) return(test_result) }
3. 明确转换分组变量为因子(可选)
确保分组变量value是因子类型,避免隐式类型转换问题:
results <- punteggi |> pivot_longer(c(Regione, Genere, Area)) |> group_by(name) |> mutate( value = as.factor(value), # 明确转换为因子 kruskal = kruskal.test(pt_tot ~ value)$p.value ) |> nest() |> mutate(kruskal_weighted = map(data, kruskal_per_gruppo))
修改后,kruskal_test即可正常创建IndependenceProblem对象并执行加权Kruskal-Wallis检验。
内容的提问来源于stack exchange,提问作者Erik De Luca
相关产品推荐
相关产品推荐

