【问题标题】:Error in creating a function to perform ttests on multiple continuous variables创建函数以对多个连续变量执行测试时出错
【发布时间】:2014-03-09 17:27:11
【问题描述】:

所以我正在尝试创建一个函数,该函数将接收一串连续变量、一个分类变量和一个数据框,并输出一个表格,其中包含每个连续变量的表格:mean group1、mean group2、teststat、置信区间, p 值。

目前这里给了我错误:model.frame.default(formula = var ~ class, data = data) 中的错误:可变长度不同(为“类”找到)

我希望得到任何有关如何修复此错误并使此功能执行我喜欢的功能的反馈。我想让这个函数更加充实和灵活,但我什至无法让基本版本(处理多个变量)工作。

谢谢!

#Continuous must be an object of the form:
   #vars<-c("cont1", "cont2", "cont3", etc)
#CREATE DATA
cat1<-sample(c(1,2), 100, replace=T)
cont1<-rnorm(100, 25, 8)
cont2<-rnorm(100, 0, 1)
cont3<-rnorm(100, 6, 14.23)
cont4<-rnorm(100, 25, 8)*runif(5, 0.1, 1)
one<-data.frame(cat1, cont1, cont2, cont3, cont4)

#FUNCTION
two.group.comp<-function(continvars,class,data){
attach(data)

descriptives<-function(var){
 test<-t.test(var~class, data)
 means<-data.frame(test[5])
 mean1<-means[1,1]
 mean2<-means[2,1]
 teststatbig<-data.frame(test[1])
 teststat<-teststatbig[1,1]
 conf<-data.frame(test[4])
 lconf<-conf[1,1]
 uconf<-conf[2,1]
 pvalues<-data.frame(test[3])
 pvalue<-pvalues[1,1]

 variablename<-deparse(substitute(var))

 entry<-data.frame(variablename,mean1,mean2,lconf,uconf,teststat,pvalue)
 }  
 var<-data.frame(continvars)
 table<<-sapply(var,descriptives)
  detach(data)
}  
#VARIABLES
continvars<-c("cont1", "cont2", "cont3")
#CALL TO FUNCTION
two.group.comp(continvars=continvars, class=cat1, data=one)

【问题讨论】:

    标签: r


    【解决方案1】:

    这是你想要的吗?

    two.group.comp <- function(continvars,class,data){
      get.stats <- function(x,cat){
        f  <- unique(cat)
        x1 <- x[cat==f[1]]
        x2 <- x[cat==f[2]]
        tt <- t.test(x1,x2)
        smry        <- c(tt$estimate,tt$statistic,p=tt$p.value)
        names(smry) <- c("mean.1","mean.2","t","p")
        return(smry)
      }
      result <- do.call(rbind,lapply(data[,continvars],get.stats,cat=class))
      return(result)
    }
    # create sample dataset
    set.seed(1)
    cat1 <-sample(c(1,2), 100, replace=T)
    cont1<-rnorm(100, 25, 8)
    cont2<-rnorm(100, 0, 1)
    cont3<-rnorm(100, 6, 14.23)
    cont4<-rnorm(100, 25, 8)*runif(5, 0.1, 1)
    one  <-data.frame(cat1, cont1, cont2, cont3, cont4)
    continvars<-c("cont1", "cont2", "cont3")
    # call the function...
    two.group.comp(continvars,cat1,one)
    #           mean.1      mean.2          t          p
    # cont1 24.4223859 25.33275704 -0.6024497 0.54827955
    # cont2  0.0330148  0.01168979  0.1013519 0.91947827
    # cont3 10.5784201  4.00651493  2.4183031 0.01747468
    

    由内而外的工作:

    1. get.stats(...) 采用 data 的单列,根据 cat 将其拆分为 x1x2,运行 t 检验,并将汇总统计信息作为命名向量返回。
    2. lapply(...) 一次将 datacontinvars 列传递给 get.stats(...)
    3. do.call(rbind,...) 将从lapply(...) 返回的向量集按行绑定在一起,以生成最终结果表。

    如果您传递列号而不是列名,这也将起作用。

    一条建议:按照您的设置方式,您传递连续变量的列名,但将分组因子作为向量传递。如果传递分组因子的列名会更简洁。

    【讨论】:

    • 这正是我想要的,谢谢!我能够将其用作基础,并从中制作了一个非常有用的小功能。但我被困住了。我已经单独发了一个帖子,因为这是一个不同的问题。如果可以的话,我希望得到更多帮助。 stackoverflow.com/questions/22313731/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2022-08-04
    • 1970-01-01
    相关资源
    最近更新 更多