首页 文章

如何在每个子组中执行Fisher测试

提问于
浏览
0

我有一个包含以下数据的数据框:

age.cat ds.cat  finalstate
<65     AGN     dead
<65     AGN     alive
<65     PC      alive
65+     AMI     alive
65+     PC      dead
<65     AMI     alive

对于 ds.cat 因子变量的每个级别,我需要对 age.catfinalstate 变量执行Fisher测试 .

我试图通过几种方式做到这一点,但没有收到我需要的东西 . 以下R代码不会产生所需的结果:

library(descr)
# 1 syntax - doesn't work
by(split(df, df$ds.cat), CrossTable(age.cat, finalstate, prop.chisq = FALSE, fisher = TRUE))
# 2 syntax - doesn't work
sapply( split(df, df$ds.cat), function(x) CrossTable(age.cat, finalstate, prop.chisq = FALSE, fisher = TRUE) )
# 3 syntax - doesn't work
for(i in 1:nlevels(ds.cat)){
    curcat <- subset(df, ds.cat == ds.cat[i])
    CrossTable(age.cat[ds.cat == ds.cat[i]], finalstate[ds.cat == ds.cat[i]], prop.chisq = FALSE, fisher = TRUE, data = curcat)
}

请有人建议如何为 ds.cat 因子变量的每个级别执行 age.catfinalstate 变量的Fisher测试?

已解决!

非常感谢你们所有人!

带有 CrossTable 的代码会产生错误

Error in chisq.test(t, correct = FALSE) : 
'x' must at least have 2 elements

但感谢@BenBolker,基础 fisher.test 函数在您的代码中运行良好

l <- split(arf.mort, arf.mort$ds.cat)
lapply(l, function(x) fisher.test(x$age.cat, x$finalstate))

以及运作良好

by(arf.mort, arf.mort$ds.cat, function(x){ fisher.test(x$age.cat, x$finalstate) })

2 回答

  • 0

    你应该提一下你正在使用的包裹( gmodels ) . 我们不想寻找 .

    require(gmodels)
    l <- split(df, df$ds.cat)
    lapply(l, function(x) CrossTable(x$age.cat, x$finalstate, 
                prop.chisq = FALSE, fisher = TRUE)
    

    它提供了一大堆表(我猜它类似于S-plus格式) .

  • 0

    假设您正在使用虹膜数据集(它是在启动R时加载的),并且您想要获取前两列的CrossTable,由Species分割 . 这是你如何做到的:

    #whatever a crosstable is
    CrossTable <- function(x, y){
        #something tricky
        sum(x+y)
    }
    
    by(iris, iris$Species, function(x){ CrossTable(x[1], x[2]) })
    

相关问题