我需要在给定数据框的情况下构建线性模型:
structure(list(cpu = c(6, 10, 20), Date = c(1425031717000, 1425031957000,
1425032197000)), .Names = c("cpu", "Date"), row.names = c(NA,
3L), class = "data.frame")
在这种情况下,我知道我可以这样做的列名:
lm(cpu~Date, data=dat)
我需要动态生成列名。我需要创建一个函数,当我准备调用lm函数时需要从数据框中提取列名。列名可以是任何内容,具体取决于数据框。
我试过了;
lm(names(dat[1])~names(dat[2]), data=dat)
我收到此错误:
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels
In addition: Warning message:
In model.response(mf, "numeric") : NAs introduced by coercion
答案 0 :(得分:3)
如果你不关心在resutls中有列的名字,你可以使用:
lm(dat[[1]]~dat[[2]])
答案 1 :(得分:2)
通过输入?formula
找到的帮助说
数据框有一个公式方法。如果只有一个 这列形成了具有空LHS的RHS。对于更多列, 第一列是公式的LHS和其余列 由+形成RHS。
formula(dat)
作为lm
的第一个arg,它是这样做的:
lm(formula(dat),data=dat)
导致
Call:
lm(formula = formula(dat), data = dat)
Coefficients:
(Intercept) Date
-4.156e+07 2.917e-05
答案 2 :(得分:2)
lm(as.formula(paste(names(dat)[1],names(dat)[2],sep="~")), data=dat)
Call:
lm(formula = as.formula(paste(names(dat)[1], names(dat)[2], sep = "~")),
data = dat)
Coefficients:
(Intercept) Date
-4.156e+07 2.917e-05
答案 3 :(得分:1)
假设您要使用您创建的所有变量,请使用&#34; 〜。 &#34;在R. Else中,您可以修改循环以仅保留您需要的字段。
Df <- structure(list(cpu ..--your data---)
##for loop##
vars=colnames(Df)[-1]
for (i in vars) {
lm.fit <- lm(paste("cpu ~", i), data=Df)
}
summary(lm.fit)