我有一个R数据框,其中包含8个级别的因子变量(有序)。我想在1级和1级之间进行t检验。 2,3和& 4,5& 6和7& 8.虽然我可以将数据子集化以提取每对类别,但我想知道是否有更简单的方法来实现它。想不通。试过以下,但它抱怨不同的长度(每个级别有不同的观察数量):
t.test(var1 ~ levels(factorvar)[1:2], data = mydf)
答案 0 :(得分:2)
我认为错误可能是因为levels(factorvar)[1:2]
只返回两个值“1”和“2”,但t.test
期望~
两边的向量长度为是相同的。换句话说,这并不是每个因素水平都有不同数量的观察结果的问题。相反,例如,如果var1
= 1的factorvar
值为var1
,而factorvar
= 2的值为~
,那么您需要一个长度向量在t.test(var1 ~ factorvar, data=mydf[mydf$factorvar %in% c(1,2),])
的两侧都有90。
请改为尝试:
# Function to return p-values from t-test between two factor levels
my.t = function(fac1, fac2){
t.test(mydf$var1[mydf$factorvar==fac1],
mydf$var1[mydf$factorvar==fac2])$p.value
}
# Run the function on factor levels 1 and 2
my.t(1,2)
# Do all four at once
mapply(my.t, seq(1,7,2), seq(2,8,2))
您还可以创建一个函数,这样就不必为每个因子组合键入所有代码:
$p.value
如果要为每对因子级别(而不仅仅是p值)返回t检验的整个输出,则从上面的函数中删除mapply
并运行SIMPLIFY=FALSE
添加了{{1}}。
这是一个编码网站,而不是统计建议网站,但也要注意multiple comparisons。
答案 1 :(得分:2)
pairs <- list( c(1, 2), c(3, 4), c(5, 6), c(7, 8) )
lapply(pairs, function(pr) {
t.test( var1 ~ factorvar,
data=dat[dat$factorvar %in$ pr, c("var1", "factorvar")] )
}
)
我没有额外(无代表性)级别会导致t.test.formula
出现问题,因为这些因素会被强制为mumeric。也可以试试:
lapply(pairs, function(pr) {
t.test( var1 ~ factorvar,
data=dat[ , c("var1", "factorvar")],
subset= factorvar %in% pr)
} )
注意:经过测试:
dat <- data.frame(var1=rnorm(100),
factorvar=factor(sample(1:8, 100, rep=TRUE)))
示例输出:
[[1]]
Welch Two Sample t-test
data: var1 by factorvar
t = -1.2077, df = 8.419, p-value = 0.26
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-1.3597432 0.4197142
sample estimates:
mean in group 1 mean in group 2
-0.1819342 0.2880802
[[2]]
Welch Two Sample t-test
data: var1 by factorvar
t = -0.8141, df = 20.676, p-value = 0.4249
#--------- rest of output snipped-------