【问题标题】:How to loop set of commands with different variable each time in R?如何在R中每次循环使用不同变量的命令集?
【发布时间】:2015-08-18 10:35:08
【问题描述】:

我对 R 编码很陌生,因此我真的需要您的帮助才能在 R 中运行循环命令。

我有一个大表(“variable_table.txt”),列如下:

sample  BMI  var1_LRR   var1_BAF    var2_LRR    var2_BAF    var3_LRR var3_BAF ........ var200_LRR var200_BAF

AA     18.9    0.27       0.99        0.18        0.99        0.11         1  ........   0.20        0.99

BB     27.1    0.23       1           0.13        0.99        0.17         1  ........   0.23        0.99

我想运行如下回归命令:

dataset<- read.table ("variable_table.txt", na.strings="NA", header=TRUE)

linear_var1 <- lm (BMI ~ var1_LRR + var1_BAF,data=dataset)

summary(linear_var1)

confint_var1_CI <- confint(linear _var1, level=0.95)

confint_var_CI

问题 1: 有人可以帮助我如何执行上述命令,并使用下一个变量(从 var1 到 var2,然后到 var3,直到 var200)再次重复它们,而无需单独运行它。

问题 2: 如何将每个运行结果编译成一个编译表?

【问题讨论】:

    标签: r regression


    【解决方案1】:

    最简单的方法是对您的 data.frame 进行子集化,例如

    mydata <- data.frame(y = runif(100),
                         foo1 = runif(100), bar1 = runif(100),
                         foo2 = runif(100), bar2 = runif(100))
    
    out <- list()
    
    for (i in 1:2)
      out[[i]] <- lm(y ~., data = mydata[, c("y", paste(c("foo", "bar"), i, sep=""))])
    

    关于将输出保存到表中,首先您必须决定要保存输出的哪一部分(例如系数)

    mytab <- matrix(NA, 2, 3)
    for (i in 1:2)
      mytab[i, ] <- out[[i]]$coefficients
    

    您还可以使用broom 库从lm 对象中提取“整洁”的输出。

    library(broom)
    tidy(out[[1]])
    ##          term   estimate  std.error statistic           p.value
    ## 1 (Intercept)  0.5060922 0.07619095  6.642419 0.000000001794162
    ## 2        foo1 -0.1567166 0.10023700 -1.563461 0.121201059993118
    ## 3        bar1  0.1578192 0.10404012  1.516907 0.132542574934363
    

    接下来,您可以使用 rbind 组合这些输出。

    【讨论】:

      【解决方案2】:

      你可以试试这样的:

      for ( i in 1:200 ) {
      
        # build the formula
        form<-as.formula(paste("BMI ~ **var", i, "**_LRR + **var", i, "**_BAF", sep=""))
      
        # make a character string with the lm-instruction, using the formula above
        code.lm<-paste("lm.V", i, "<-lm(form, data=dataset)", sep="")
        # dynamically execute the code in that string
        eval(parse(text=code.lm))
      
        # create a string xith the summary code
        code.summ<-paste("summary(lm.V", i, ")", sep="")
        # dynamically execute the string
        eval(parse(text=code.summ))
      
      }
      

      我按照'summary'指令完成了它,但其余部分类似:您将代码“粘贴”到字符串中,然后使用“eval(parse(text=))”执行它。

      在此之后,您可以访问变量 'lm.V1', ... 'lm.V200'

      【讨论】:

        【解决方案3】:

        如果您先重新排列数据框,您会更轻松地处理它:

        library(tidyr)
        # gather all columns into a single column
        tidied <- gather(dataset, var, value, -sample, -BMI)
        
        # separate the "var" column into varnum (var1, var2...) and variable
        tidied <- separate(tidied, var, c("var1", "variable"))
        
        # now spread the two variables (BAF and LRR) back across columns
        tidied <- spread(tidied, variable, value)
        

        您最终会得到一个包含五列的表 xsampleBMIvar(即 var1var2 等)、LRR 和 @ 987654329@。它的行数将是当前表的 200 倍。请注意,使用%&gt;% 运算符,您可以按照以下方式执行上述步骤:

        library(dplyr)
        tidied <- dataset %>%
          gather(var, value, -sample, -BMI) %>%
          separate(var, c("var", "variable")) %>%
          spread(variable, value)
        

        完成重新排列后,您可以使用 dplyr 的 group_bydo 以及扫帚在每个 var 中轻松执行线性回归:

        library(broom)
        coefs <- tidied %>%
          group_by(var) %>%
          do(tidy(lm(BMI ~ BAF + LRR, data = .), conf.int = TRUE))
        

        例如,如果您的数据集是:

        set.seed(1)
        dataset <- data.frame(sample = 1:100, BMI = rnorm(100),
                              var1_LRR = rnorm(100), var1_BAF = runif(100),
                              var2_LRR = rnorm(100), var2_BAF = runif(100),
                              var3_LRR = rnorm(100), var3_BAF = runif(100))
        

        上述代码的结果是:

        Source: local data frame [9 x 8]
        Groups: var
        
           var        term      estimate  std.error    statistic   p.value    conf.low conf.high
        1 var1 (Intercept)  0.1298513867 0.17715588  0.732978145 0.4653394 -0.22175399 0.4814568
        2 var1         BAF -0.0415096698 0.30068830 -0.138048836 0.8904880 -0.63829271 0.5552734
        3 var1         LRR  0.0001270982 0.09550805  0.001330759 0.9989409 -0.18942994 0.1896841
        4 var2 (Intercept)  0.1064316834 0.18173583  0.585639517 0.5594779 -0.25426363 0.4671270
        5 var2         BAF  0.0144181386 0.31656921  0.045544981 0.9637666 -0.61388410 0.6427204
        6 var2         LRR -0.0470190629 0.09340229 -0.503403723 0.6158217 -0.23239676 0.1383586
        7 var3 (Intercept)  0.0616288934 0.17865709  0.344956329 0.7308741 -0.29295597 0.4162138
        8 var3         BAF  0.1045320710 0.31246736  0.334537572 0.7386962 -0.51562914 0.7246933
        9 var3         LRR  0.1118595808 0.07714709  1.449952134 0.1502976 -0.04125603 0.2649752
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-16
          • 1970-01-01
          • 1970-01-01
          • 2019-08-23
          • 2022-01-21
          • 2020-12-09
          相关资源
          最近更新 更多