t-test在函数中不起作用 - 变量长度不同

时间:2014-05-15 14:54:05

标签: r

这里有一个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)
  }
}

但这给了我同样的错误。

如果有人能指出我的(可能是愚蠢的)错误,我会很感激。

1 个答案:

答案 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。