2016-09-02 20 views
1

Ich habe ein Problem, die Objekttypen zu steuern, die in die Vorhersagefunktion einspeisen. Hier ist meine vereinfachte Funktion, die das Objekt glm generiert.glm `predict()` Fehler: keine anwendbare Methode für 'predict' angewendet auf ein Objekt der Klasse "list"

fitOneSample <- function(x,data,sampleSet) 
{ 
    #how big of a set are we going to analyze? Pick a number between 5,000 & 30,000, then select that many rows to study 
    sampleIndices <- 1:5000 

    #now randomly pick which columns to study 
    colIndices <- 1:10 

    xnames <- paste(names(data[,colIndices]),sep = "") 
    formula <- as.formula(paste("target ~ ", paste(xnames,collapse = "+"))) 
    glm(formula,family=binomial(link=logit),data[sampleIndices,]) 
} 

myFit <- fitOneSample(1,data,sampleSet) 
fits <- sapply(1:2,fitOneSample,data,sampleSet) 
all.equal(myFit,fits[,1]) #different object types 

#this works 
probability <- predict(myFit,newdata = data) 

#this doesn't 
probability2 <- predict(fits[,1],newdata = data) 
# Error in UseMethod("predict") : 
# no applicable method for 'predict' applied to an object of class "list" 

Wie greife ich auf die Spalte in fits[,1], so dass ich die Funktion vorhersagen kann gleiches Ergebnis zu erhalten, die ich mit myFit tat?

+0

Versuchen 'fits <- lapply (1: 2, fitOneSample, Daten, Sampleset)', dann 'probability2 < - vorhersagen (passt [[1]], newdata = Daten) '. – cryo111

+0

Danke @ Cryo111. Das hat perfekt funktioniert. –

Antwort

1

Ich denke, ich bin jetzt in der Lage, Ihre Situation wiederherzustellen.

fits <- sapply(names(trees), 
       function (y) do.call(lm, list(formula = paste0(y, " ~ ."), data = trees))) 

Diese verwendeten Einbau-Datensatz trees als Beispiel, passend drei lineare Modelle:

Girth ~ Height + Volume 
Height ~ Girth + Volume 
Volume ~ Height + Girth 

Da wir sapply verwendet haben, und jede Iteration gibt dasselbe lm Objekt oder ein länge 12 Liste, werden die Ergebnisse auf eine 12 * 3 Matrix vereinfacht werden:

class(fits) 
# "matrix" 

dim(fits) 
# 12 3 

Matrix Indizierung fits[, 1] ist gültig. Wenn Sie str(fits[, 1]) überprüfen, sieht es fast wie ein normales lm Objekt aus. Aber wenn Sie weiter überprüfen:

class(fits[, 1]) 
# "list" 

Em? Es hat keine "lm" -Klasse! Als Ergebnis versagt S3 Versandweg, wenn Sie generische Funktion predict nennen:


Dies als gutes Beispiel gesehen werden kann

predict(x) 
#Error in UseMethod("predict") : 
# no applicable method for 'predict' applied to an object of class "list" 
dass sapply destruktiv ist.
Wir wollen lapply, oder zumindest, sapply(..., simplify = FALSE):

fits <- lapply(names(trees), 
       function (y) do.call(lm, list(formula = paste0(y, " ~ ."), data = trees))) 

Die Ergebnisse der lapply ist leichter zu verstehen. Es ist eine Länge-3-Liste, wobei jedes Element ein lm Objekt ist. Wir können über fits[[1]] auf das erste Modell zugreifen. Jetzt wird alles funktionieren:

class(fits[[1]]) 
# "lm" 

predict(fits[[1]]) 
#  1   2   3   4   5   6   7   8 
# 9.642878 9.870295 9.941744 10.742507 10.801587 10.886282 10.859264 10.957380 
#  9  10  11  12  13  14  15  16 
#11.588754 11.289186 11.946525 11.458400 11.536472 11.835338 11.133042 11.783583 
#  17  18  19  20  21  22  23  24 
#13.547349 12.252715 12.603162 12.765403 14.002360 13.364889 14.535617 15.016944 
#  25  26  27  28  29  30  31 
#15.628799 17.945166 17.958236 18.556671 17.229448 17.131858 21.888147 

Sie Ihren Code beheben, indem

fits <- lapply(1:2,fitOneSample,data,sampleSet) 
probability2 <-predict(fits[[1]],newdata = data) 
+0

Danke dafür. Mein Hauptproblem bestand darin, die Struktur während einer Schleife zu bewahren. Ihre Kommentare haben mir klar gemacht, dass Sapply die Struktur zerstört - gut zu wissen. Ich habe meine vorherige Funktion geändert, um "lapply" zu verwenden. –

Verwandte Themen