2017-01-09 3 views
-1

Ich möchte Ergebnisse der linearen Regression in Liste wie Abschnitt und Koeffizienten speichern. Ich habe folgenden CodeWie führe ich eine Liste zu einer Funktion in R

results = list() 
intercept = list() 
coeff = list() 

GetLM = function(dataframe,results,intercept,coeff){ 
    unq_clients = as.vector(unique(dataframe$clients)) 
    for(i in 1:length(unq_clients)){ 
     new_df=dataframe[dataframe$clients == unq_clients[i],] 
     regression= lm(a ~ b,data = new_df) 
     results[[i]] = coef(regression) 
     intercept[i] = results[[i]][1] 
     coeff[i]=results[[i]][2] 
    } 
} 

Aber nichts wird in der Liste gespeichert, wenn ich die Funktion aufrufen. Was mache ich falsch?

+0

warum ist ein 'return()' Anweisung in Ihrer Funktion fehlt. Andernfalls werden keine Ergänzungen zu Ergebnissen außerhalb des Funktionsumfangs vorgenommen. füge am Ende der Funktion –

+0

etwas wie 'return (list (results, intercept, coeff))' hinzu und vermeide auch die 'for' -Schleife. versuchen Sie etwas wie 'lapply()' –

Antwort

0

Ich fühle, dass Sie diese Funktion nicht R programmiert haben. Warum würden Sie results, intercept und coeff als Argumente zu GetLM benötigen? Stattdessen machen die Funktion eine Liste mit diesen Variablen zurück:

GetLM <- function(dataframe){ 
    unq_clients <- as.vector(unique(dataframe$clients)) 
    for(i in 1:length(unq_clients)){ 
     new_df <- dataframe[dataframe$clients == unq_clients[i],] 
     regression <- lm(a~b,data = new_df) 
     results <- coef(regression) 
     intercept[i] <- results[[i]][1] 
     coeff[i] <- results[[i]][2] 
    } 
    return(list(results = results, intercept = intercept, coeff = coeff)) 
} 

Also jetzt, dass Sie tun können:

0

Sie lässt sich perfekt mit Ihrem eigenen Code fortsetzen, müssen nur eine return() Erklärung hinzufügen, wie Ich habe in den Kommentaren erwähnt.

Hier verwende ich , um die for Schleife zu ersetzen und es auch verallgemeinern so dass, auch wenn Ihr Modell mehr als 1 unabhängig hat, können Sie sie auf eine bessere Weise extrahieren.

Hinweis: Ich verwende mtcars zu erklären, da Sie keine Daten mit uns nicht geteilt

unq_cyl = as.vector(unique(mtcars$cyl)) # 3 unique values 
results <- lapply(seq_along(unq_cyl), function(x) { 
            new_df = mtcars[mtcars$cyl == unq_cyl[x],] 
            regression= lm(mpg ~ disp + wt,data = new_df) 
            results=coef(regression) 
            results}) 

intercept <- sapply(results, FUN = function(i) i[names(i) %in% "(Intercept)"]) 
coeff <- sapply(results, FUN = function(i) i[!(names(i) %in% "(Intercept)")]) 


results 
#[[1]] 
#(Intercept)  disp   wt 
#28.18834771 0.01914227 -3.83509580 
# 
#[[2]] 
#(Intercept)  disp   wt 
# 41.1350198 -0.1224733 -0.6978035 
# 
#[[3]] 
# (Intercept)   disp   wt 
#24.077855175 -0.002511735 -2.023137804 

intercept 
#(Intercept) (Intercept) (Intercept) 
# 28.18835 41.13502 24.07786 
coeff 
#   [,1]  [,2]   [,3] 
#disp 0.01914227 -0.1224733 -0.002511735 
#wt -3.83509580 -0.6978035 -2.023137804 
+0

@Neil wir müssen diese Frage schließen, wenn jemand Ihre Frage genau beantwortet hat. Machst du das? Bitte besuchen Sie http://stackoverflow.com/help/someone-answers –

Verwandte Themen