我在使用非配对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个条目需要按名称列中的值进行分组。因此,为什么我需要聚合函数。
感谢您的帮助。
答案 0 :(得分:2)
aggregate
不是在这里使用的正确函数,因为摘要函数一次只能在一列上运行。使用此方法无法同时获得a
和b
值。
您可以解决问题的另一种方法是拆分数据,然后将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.test
和a
列执行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
不是正确的功能。以下是使用dplyr
或data.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]