我一直在寻找一种使用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="+"), ")")
)
))
但是
答案 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
函数,paste
和paste0
函数完全向量化,因此不需要循环。
如果前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)