这里有一个R新手,所以这可能是一个非常简单的问题。
我有一个带有GENDER(是一个二元变量)和大量数值变量的数据集。我想编写一个检查方差相等的简单函数,然后执行适当的t检验。
所以我的第一次尝试是这样的:
genderttest<-function(x){ # x = outcome variable
attach(Dataset)
on.exit(detach(Dataset))
VARIANCE<-var.test(Dataset[GENDER=="Male",x], Dataset[GENDER=="Female",x])
if(VARIANCE$p.value<0.05){
t.test(x~GENDER)
}else{
t.test(x~GENDER, var.equal=TRUE)
}
}
这在函数之外效果很好(当然替换x),但这里给了我一个错误,因为变量长度不同。
所以我认为它可能会奇怪地处理NA案例,我应该首先清理数据集,然后执行测试:
genderttest<-function(x){ # x = outcome variable
Dataset2v<-subset(Dataset,select=c("GENDER",x))
Dataset_complete<-na.omit(Dataset2v)
attach(Dataset_complete)
on.exit(detach(Dataset_complete))
VARIANCE<-var.test(Dataset_complete[GENDER=="Male",x], Dataset_complete[GENDER=="Female",x])
if(VARIANCE$p.value<0.05){
t.test(x~GENDER)
}else{
t.test(x~GENDER, var.equal=TRUE)
}
}
但这给了我同样的错误。
如果有人能指出我的(可能是愚蠢的)错误,我会很感激。
答案 0 :(得分:1)
我认为问题在于,当您致电t.test(x~GENDER)
时,它正在评估x
范围内的变量Dataset
,而不是您的函数范围。因此,它试图比较两个性别之间x
的值,并且因为Dataset
中没有名为x
的变量而感到困惑。
应该起作用的解决方案是:
do.call('t.test', args=list(formula=as.formula(paste0(x,'~GENDER')), data=Dataset))
do.call('t.test', args=list(formula=as.formula(paste0(x,'~GENDER')), var.equal=T, data=Dataset))
将调用t.test()
并将x
的值作为公式参数的一部分而不是字符x(即score ~ GENDER
而不是x ~ GENDER
)传递。
您看到的特定错误的原因是Dataset$GENDER
的长度等于Dataset
中的行数,而Dataset$x
的长度= 0。