/ / Wie erstellt man ein lineares Modell ohne die Spaltennamen im Datenrahmen zu kennen? - r

Wie erstellt man ein lineares Modell ohne die Spaltennamen im Datenrahmen zu kennen? - r

Ich muss ein lineares Modell mit einem Datenrahmen erstellen:

structure(list(cpu = c(6, 10, 20), Date = c(1425031717000, 1425031957000,
1425032197000)), .Names = c("cpu", "Date"), row.names = c(NA,
3L), class = "data.frame")

In diesem Fall kenne ich die Spaltennamen, die ich tun kann:

lm(cpu~Date, data=dat)

Ich muss Spaltennamen dynamisch generieren. Ich muss eine Funktion erstellen und Spaltennamen aus Datenrahmen extrahieren, wenn ich bereit bin, die LM-Funktion aufzurufen. Spaltennamen können alles sein, was vom Datenrahmen abhängt.

Ich habe es versucht;

lm(names(dat[1])~names(dat[2]), data=dat)

Ich bekomme diesen Fehler:

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

Antworten:

2 für die Antwort № 1

Die Hilfe, gefunden durch Tippen ?formulasagt

Es gibt eine Formelmethode für Datenrahmen. Wenn es nur einen gibt Spalte diese bildet die RHS mit einer leeren LHS. Für mehr Spalten, die Die erste Spalte ist die LHS der Formel und die restlichen Spalten getrennt durch + bilden die RHS.

Damit formula(dat) als der erste arg zu lm macht es:

lm(formula(dat),data=dat)

ergebend

Call:
lm(formula = formula(dat), data = dat)

Coefficients:
(Intercept)         Date
-4.156e+07    2.917e-05

3 für die Antwort № 2

Wenn es Ihnen nicht wichtig ist, die Namen der Spalten in den Ergebnissen zu haben, können Sie folgendes tun:

lm(dat[[1]]~dat[[2]])

2 für die Antwort № 3
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

1 für die Antwort № 4

Angenommen, Sie möchten alle Variablen verwenden, die Sie erstellen, verwenden Sie "~." In R. Andernfalls können Sie die Schleife ändern, um nur die Felder zu behalten, die Sie benötigen.

    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)