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因子变量的每个级别,我都需要对变量进行 Fisherage.cat检验finalstate

我尝试通过多种方式做到这一点,但没有收到我需要的东西。以下 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)
}

请任何人建议如何对因子变量的每个级别执行 Fisher 检验age.cat和变量?finalstateds.cat

解决!

非常感谢你们所有人!

此代码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) })
4

2 回答 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 格式)。

于 2013-03-06T18:06:08.383 回答
0

假设您正在使用 iris 数据集(它在您启动 R 时加载),并且您想要获取前 2 列的 CrossTable,按物种拆分。这就是你的做法:

#whatever a crosstable is
CrossTable <- function(x, y){
    #something tricky
    sum(x+y)
}

by(iris, iris$Species, function(x){ CrossTable(x[1], x[2]) })
于 2013-03-06T18:09:02.167 回答