2016-06-23 21 views
-2


Ich habe einen Datenrahmen mit Spaltennamen A, B, C, D mit numerischen Werten. Ich versuche, ein lineares Regressionsmodell zu erzeugen, das Variablen verwendet und alle mögliche Kombination versucht, wie A, A + B, A + C, B, B + C ....
Ich habe Probleme, Kombinationen mit Datenrahmen zu erzeugen.Kombination von Datenrahmen Spalten in Regression r

Data frame 
DependentVar A B C D 

Ich versuche, etwas zu erzeugen:
Kombinationen von unabhängigen Variablen wie:

var <- A,B,C,D,A+B,A+C,A+D,B+C,B+D,C+D,A+B+C,A+B+D and so on.. 
for (v in var){ 
models <- lm (DependentVar ~ eval(parse(text=v)), data=data) 
r2 <- append(summary(models)$r.squared) 
} 

Output wie Datenrahmen:

Variable combination Model R2  
A      0.8 
B      0.7 
. 
. 

und so weiter
Jede Hilfe wird sehr geschätzt!

Antwort

1

Sie haben die richtige Idee, aber Sie können die Ergebnisse nach 1) verbessern mit lapply() und 2) mit as.formula()

set.seed(1) 
d<-data.frame(DV=rnorm(100,mean=100,sd=10),A=rnorm(100,mean=100,sd=10),B=rnorm(100,mean=100,sd=10)) 

formula_list<-list(as.formula('DV ~ A'), 
        as.formula('DV ~ B'), 
        as.formula('DV ~ A + B')) 

lapply(formula_list, FUN = lm, data=d) 

Um den Ausgangsdatenrahmen zu erhalten, können Sie das gleiche verwenden Maschinerie, aber anstelle von FUN = lm, setze FUN =, um ein Wrapper für lm zu sein, der die Post-Regression-Verarbeitung durchführt.

lm_wrapper<-function(formula, data){ 
    reg_res<-lm(formula, data=data) 
    rsq<-summary(reg_res)$r.squared 
    return(data.frame(formula=as.character(formula)[3], rsq=rsq)) 
} 

all_res<-lapply(formula_list, FUN = lm_wrapper, data=d) 

all_res_stack<-do.call('rbind',all_res) 

Hier ist, was all_res_stack wie folgt aussieht:

> all_res_stack 
    formula   rsq 
1  A 0.004809535 
2  B 0.026144428 
3 A + B 0.026821577 
+0

Dank für Ihren Kommentar danken. Ich habe einen Zweifel, wie man die formula_list automatisch generiert und nicht manuell aufschreibt. Mein tatsächlicher Datenrahmen hat mehr als 20 Spalten und das Schreiben aller von ihnen wäre fast unmöglich. Können Sie einen Code zum Generieren der Variablenkombinationsliste vorschlagen? Danke – rkg

+0

Aggree mit @ZheyuanLi. Ich habe die Hälfte durch diesen Beitrag geschafft, bevor er als dup markiert wurde. Aber die ursprüngliche Antwort hat Möglichkeiten, die Formel automatisch zu generieren. Abgesehen davon, sind Sie sicher, was auch immer Sie tun, ist eine gute Sache zu tun? Sehr selten habe ich gesehen, dass Menschen Regressionen im industriellen Maßstab schätzen und nur R^2-Statistiken auf statistisch vernünftige Weise betrachten. – AOGSTA

0
set.seed(123) 

mydata <- data.frame(A = rnorm(10, mean = 5), 
        B = rnorm(10, mean = 10), 
        C = rnorm(10, sd = 2), 
        D = rnorm(10, sd = 5)) 
mydata$DependentVar <- with(mydata, A + B + C + D + rnorm(10)) 

# expand.grid makes a data.frame, where each possible combination of values is 
# given a row. Here, each row states which variables to use in a model. Remove 
# the row where no variables are used. 
independent_vars <- c('A', 'B', 'C', 'D') 
include_choices <- lapply(independent_vars, function(x) c(TRUE, FALSE)) 
names(include_choices) <- independent_vars 

combos <- do.call('expand.grid', args = include_choices) 

combos <- combos[apply(combos, 1, any), ] 

# Use combos to construct each model 
predict_some_cols <- function(which_cols) { 
    model_vars <- c('DependentVar', colnames(combos)[which_cols]) 
    lm(DependentVar ~ ., data = mydata[, model_vars]) 
} 

model_list <- apply(combos, 1L, predict_some_cols) 

# A really weird-looking way makes names, please somebody improve this 
names(model_list) <- apply(combos, 1, 
          FUN = function(which_cols) { 
          paste0(colnames(combos)[which_cols], 
            collapse = ' + ') 
          }) 

# Now go through the models and get the desired data. 
rsquared <- vapply(model_list, 
        function(model) summary(model)$r.squared, 
        numeric(1)) 
+0

Ich weiß es nicht. Vielleicht hatte ich das Antwortfeld geöffnet, bevor es als Duplikat markiert wurde. –

Verwandte Themen