R中使用by()对data.frame进行二项式测试

时间:2012-12-07 22:07:37

标签: r function apply

binom.test选项中使用时,我对by的行为感到困惑。

它似乎不适用于某些数据帧,但可以处理我放在一起的一些虚拟数据。

调用mean()可以正常工作......

我的示例代码如下。


#####  this does not work...

bug <- InsectSprays   
bug$outcome <- ifelse(bug$count > 4, 1, 2 )
bug$spray.n <- ifelse(bug$spray == "A", 1,
               ifelse(bug$spray == "B", 2,
               ifelse(bug$spray == "C", 3,
               ifelse(bug$spray == "D", 4,
               ifelse(bug$spray == "E", 5, 6)))))

binom.test(table(bug$outcome), alternative="greater")               
by(bug, bug$spray.n, FUN = function(X) binom.test(table(X$outcome),
  alternative="greater" ))
by(bug, bug$spray.n, FUN = function(X) mean(X$count)                             

#####  this works...

#####  generating example data
#####  this has three groups, each with a binomial indicator
#####  success is coded as 1, failure as a 0

set.seed(271828)
center <- gl(3,10)
outcome <- rbinom(length(center), 1, .6777)
id <- seq(1,length(center),1)
dat <- as.data.frame(cbind(center,id,outcome))

#####  have to recode success and failure to use table()  
#####  !!!!! would like to avoid having to do this...

dat$primary <- ifelse(dat$outcome == 1 , 1 , 2)
dat$cent <- as.factor(dat$center)

##### carrying out one sided binomial test for positive outcome

binom.test(table(dat$primary), alternative = "greater" )

#####  would like to carry out the same test by center...

by(dat, dat$center, FUN = function(X) binom.test(table(X$primary), 
  alternative = "greater"))
by(dat, dat$center, FUN = function(X) mean(X$outcome))

2 个答案:

答案 0 :(得分:2)

有些binom.test调用不起作用的原因是因为某些组有所有成功(或失败)。因此,为了进行测试,你需要在每个组中至少有两个级别(这完全有道理......)。


为了完整性:

           #####  this does work...

           air <- airquality
           air

           air$outcome <- ifelse(air$Wind > 10, 1, 2 )


           binom.test(table(air$outcome), alternative="greater")



           by(air, air$Month, FUN = function(X) mean(X$Wind))

           by(air, air$Month, FUN = function(X) table(X$outcome))

           by(air, air$Month, FUN = function(X) binom.test(table(X$outcome), alternative="greater"))

答案 1 :(得分:1)

如果您尝试,可以看到问题:

by(bug, bug$spray.n, FUN = function(X) table(X$outcome))