使用R中的聚合函数执行t检验

时间:2014-07-01 06:35:53

标签: r aggregate

我在使用非配对t检验和聚合函数时遇到困难。

实施例

dd<-data.frame(names=c("1st","1st","1st","1st","2nd","2nd","2nd","2nd"),a=c(11,12,13,14,2.1,2.2,2.3,2.4),b=c(3.1,3.2,3.3,3.4,3.1,3.2,3.3,3.4))
dd
#  Compare all the values in the "a" column that match with "1st" against the values in the "b" column that match "1st".  
#  Then, do the same thing with those matching "2nd"

t.test(c(11,12,13,14),c(3.1,3.2,3.3,3.4))$p.value
t.test(c(3.1,3.2,3.3,3.4),c(3.1,3.2,3.3,3.4))$p.value

#  Also need to replace any errors from t.test that have too low variance with NA
#  An example of the type of error I might run into would be if the "b" column was replaced with c(3,3,3,3,3,3,3,3).  

对于配对数据,我找到了解决方法。

#  Create Paired data.
data_paired<-dd[,3]-dd[,2]

#  Create new t-test so that it doesn't crash upon the first instance of an error.  
my_t.test<-function(x){
    A<-try(t.test(x), silent=TRUE)
    if (is(A, "try-error")) return(NA) else return(A$p.value)
}

#  Use aggregate with new t-test.  
aggregate(data_paired, by=list(dd$name),FUN=my_t.test)

此聚合使用单列输入。但是,当我必须有多个列进入函数时,我无法使其正常运行。

示例:

my_t.test2<-function(x,y){
    A<-try(t.test(x,y,paired=FALSE), silent=TRUE)
    if (is(A, "try-error")) return(NA) else return(A$p.value)
}

aggregate(dd[,c(2,3)],by=list(dd$name),function(x,y) my_t.test2(dd[,3],dd[,2]))

我原以为聚合函数只会将与列表中的值匹配的行发送到函数my_t.test2,然后移动到下一个列表元素。但是,产生的结果表明它正在对列中的所有值执行t检验,如下所示。然后将每个值放在结果中。

t.test(dd[,3],dd[,2])$p.value

我错过了什么?这是原始my_test.2的问题,如何构建聚合函数或其他问题。我应用它的方式似乎并没有聚合。

这些是我想要的结果。

t.test(c(11,12,13,14),c(3.1,3.2,3.3,3.4))$p.value
t.test(c(3.1,3.2,3.3,3.4),c(3.1,3.2,3.3,3.4))$p.value

要注意,这是一个玩具示例,实际数据集将有超过100,000个条目需要按名称列中的值进行分组。因此,为什么我需要聚合函数。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

aggregate不是在这里使用的正确函数,因为摘要函数一次只能在一列上运行。使用此方法无法同时获得ab值。

您可以解决问题的另一种方法是拆分数据,然后将t检验应用于每个子集。这是一个实现

sapply(
    split(dd[-1], dd$names), 
    function(x) t.test(x[["a"]], x[["b"]])$p.value
)

在此,我将dd拆分为names的每个值的子集列表。我使用dd[-1]删除&#34;名称&#34;从子集到我的列只有一个包含两列的data.frame。一个用于a,另一个用于b

然后,对于列表中的每个子集,我使用t.testa列执行b。然后我提取p值。 sapply包装器为每个子集计算此p值,并且rill返回一个p值的命名向量,其中条目的名称对应于dd$names

的级别
         1st          2nd 
6.727462e-04 3.436403e-05 

如果您想以这种方式进行配对t检验,可以

sapply(
    split(dd[-1], dd$names), 
    function(x) t.test(x[["a"]] - x[["b"]])$p.value
)

答案 1 :(得分:2)

正如@MrFlick所说,agregate不是正确的功能。以下是使用dplyrdata.table包的sapply方法的一些替代方法。

require(dplyr)
summarize(group_by(dd, names), t.test(a,b)$p.value)

require(data.table)
data.table(dd)[, t.test(a,b)$p.value, by=names]