使用lapply在数据帧的行上运行精确的二项式测试

时间:2014-09-16 18:09:36

标签: r

我正在尝试运行一个精确的测试来比较观察到的和预期的许多不同的观察和期望对。

对于每一行,我想将data$readCountdata$refFractiontrials的常数进行比较(这是所有data$readCounts的总和)。

我考虑这样做的方式是

test <- function(x, p, n){binom.test(x, n, p, alternative="two-sided")}
result <- lapply(data[c("readCount", "refFraction")], test, n=trials)

但是这给了我错误incorrect length of 'x'

我是否在正确的轨道上,或者是否有更好的方法来应用比较数据框(具有其他成员)的每一行中的两个值的函数?

2 个答案:

答案 0 :(得分:1)

这应该可行。如果没有,请执行dput(head(data))并在此处回复。

test = function(x,...) {binom.test(x = x["readCount"], p = x["refFraction"], ...)}
result = apply(X = data[,c("readCount", "refFraction")], MARGIN = 1, FUN = test, n = trials)

生成一些虚假数据进行测试

trials = 15
data = data.frame(readCount = sample(1:10, rep=T), refFraction = runif(10))
> head(result, 2)

[[1]]

    Exact binomial test

data:  x["readCount"] and trials
number of successes = 10, number of trials = 15, p-value = 0.2008
alternative hypothesis: true probability of success is not equal to 0.4877061
95 percent confidence interval:
 0.3838037 0.8817589
sample estimates:
probability of success 
             0.6666667 


[[2]]

    Exact binomial test

data:  x["readCount"] and trials
number of successes = 4, number of trials = 15, p-value = 0.4325
alternative hypothesis: true probability of success is not equal to 0.386819
95 percent confidence interval:
 0.07787155 0.55100324
sample estimates:
probability of success 
             0.2666667 

答案 1 :(得分:1)

您也可以使用相同的功能通过mapply执行此操作

 test <- function(x, p, n){binom.test(x, n, p, alternative="two-sided")}

 mapply(test, data$readcount, data$refFraction, MoreArgs=list(n=trials))

这将通过元素方式将数据$ readcount传递给x,将数据$ refFraction传递给y,然后将测试传递给n。通过elementwise,我的意思是mapply将迭代超过1:nrow(数据),然后传递数据$ readcount的第一个元素和数据$ refFraction的第一个元素进行测试,然后是第二个元素,第三个元素,第四个等,

从逻辑上讲,这对我很有意义,因为它可以很好地映射到您尝试做的事情,并且还为您提供了一种访问信息的好方法,因为输出是一个数据框,其中行是不同的输出。测试功能。

 #output

#                 [,1]                   [,2]                     [,3]                   [,4]                      
#statistic   8                      2                        7                      1                         
#parameter   15                     15                       15                     15                        
#p.value     0.44074232315963679518 0.0001140445360346263213 0.60881612435467258315 0.000019338859687764081761
#conf.int    Numeric,2              Numeric,2                Numeric,2              Numeric,2                 
#estimate    0.53333333333333332593 0.13333333333333333148   0.46666666666666667407 0.066666666666666665741   
#null.value  0.42563646589405834675 0.62898111436516046524   0.54625841975212097168 0.60785512323491275311    
#alternative "two.sided"            "two.sided"              "two.sided"            "two.sided"               
#method      "Exact binomial test"  "Exact binomial test"    "Exact binomial test"  "Exact binomial test"     
#data.name   "x and n"              "x and n"                "x and n"              "x and n"          

作为一个注释,虽然看起来在这种方法中没有出现置信区间,但尝试抓住一个会给出以下内容

# [[1]]
# [1] 0.26586134727739663131 0.78733327048069212672
# attr(,"conf.level")
# [1] 0.94999999999999995559

因此它们被保留,只是没有视觉输出