For循环:遍历列名称

时间:2017-07-30 22:21:42

标签: r regression

我一直在寻找一种使用for循环来写这个的简短方法

即:我是1到22,我的数据将在多元回归中添加第1列到第22列:

reg <-lm(log(y)~x1+x2+x3+x4+x5+x6+x7+x8+x9+x10+z1+z+z3+z4+z5+z6+z7+z8+z9+z10+z11+z12, data)

为了澄清,x1和x2以及x3都是列名 - 它们是x 2(不是x平方),我试图用我的数据集中的最后22列进行多元回归

有人建议这样做:

reg1 <- lm(log(data$y)~terms( as.formula( 
  paste(" ~ (", paste0("X", 29:ncol(data) , collapse="+"), ")")
)         
))

但是

  1. 不起作用
  2. 我不认为它正在进行多元回归(xone + xtwo + xthree),而是将二进制值1分配给每个变量x1,x2,x3 ......并添加它们,这不是我想要的。< / LI>

2 个答案:

答案 0 :(得分:1)

我知道要求for循环,但这可能是一个笨拙的策略,所以这是一个可能正确的策略:

formchr <- paste(  
            paste( "log(y)" , paste0( "x", 1:10, collapse="+"), sep="~"),  
                   # the LHS and first 10 terms
                                paste0( "z", 1:12, collapse="+"), #next 12 terms
                   sep="+")   # put both parts together
reg1 <- lm( as.formula(formchr), data=data)

公式的完整字符版本应传递给as.formula函数,pastepaste0函数完全向量化,因此不需要循环。

如果前22列是RHS术语的理想目标,那么您可以将names(data)[1:22]...[29:50]粘贴在一起,如果这些是hte位置,并且htis将替换为RHS术语上面第二个paste,删除第三个paste

我使用data作为对象名称的唯一原因是问题隐含了它。使用该名称是一个非常令人困惑的做法。 data是一个R函数,对象应具有不与函数名重叠的特定名称。在这方面另一个非常常见的滥用名称是df,这是分发的密度函数。

答案 1 :(得分:0)

您可以先将数据子集化为data.frame,其中只包含感兴趣的列。然后,您可以使用.公式语法运行线性模型,以选择y变量以外的所有列。

使用1000行和50列数据的示例

N <- 1000
P <- 50
data <- as.data.frame(rep(data.frame(rnorm(N)), P))

将您的y数据分配给y。

y <- as.data.frame(rep(data.frame(rnorm(N)), 1))

创建一个包含y和最后22列的新data.frame。

   model_data <- cbind(y, data[ ,29:50])
   colnames(model_data) <- c("y", paste0("x", 1:10), paste0("z",1:12))

以下应该可以解决问题。 .公式语法将选择y列以外的所有列。

 reg <-lm(log(y) ~ ., data = model_data)