2012-12-23 10 views
13

Meine Frage bezieht sich auf this one bezüglich kategorischer Daten (Faktoren in R-Begriffen) bei Verwendung des Caret-Pakets. Ich verstehe aus dem verlinkten Post, dass, wenn Sie die "Formel-Schnittstelle" verwenden, einige Funktionen Faktoren sein können und das Training gut funktioniert. Meine Frage ist, wie kann ich die Daten mit der preProcess() Funktion skalieren? Wenn ich versuche, und tun es mit einigen Spalten als Faktoren auf einem Datenrahmen, erhalte ich diese Fehlermeldung:Wie PreProcess Funktionen, wenn einige von ihnen Faktoren sind?

Error in preProcess.default(etitanic, method = c("center", "scale")) : 
    all columns of x must be numeric 

Sehen Sie hier einige Beispiel-Code:

library(earth) 
data(etitanic) 

a <- preProcess(etitanic, method=c("center", "scale")) 
b <- predict(etitanic, a) 

Danke.

Antwort

18

Es ist wirklich das gleiche Problem wie die Post, die Sie verknüpfen. preProcess nur auf numerische Daten arbeitet und Sie haben:

> str(etitanic) 
'data.frame': 1046 obs. of 6 variables: 
$ pclass : Factor w/ 3 levels "1st","2nd","3rd": 1 1 1 1 1 1 1 1 1 1 ... 
$ survived: int 1 1 0 0 0 1 1 0 1 0 ... 
$ sex  : Factor w/ 2 levels "female","male": 1 2 1 2 1 2 1 2 1 2 ... 
$ age  : num 29 0.917 2 30 25 ... 
$ sibsp : int 0 1 1 1 1 0 1 0 2 0 ... 
$ parch : int 0 2 2 2 2 0 0 0 0 0 ... 

Sie können nicht Zentrum und Maßstab pclass oder sex wie sie ist, so müssen sie Dummy-Variablen umgewandelt werden. Sie können model.matrix oder caret die Verwendung dummyVars dies zu tun:

> new <- model.matrix(survived ~ . - 1, data = etitanic) 
> colnames(new) 
[1] "pclass1st" "pclass2nd" "pclass3rd" "sexmale" "age"  
[6] "sibsp"  "parch" 

Die -1 wird der Intercept befreien. Jetzt können Sie preProcess für dieses Objekt ausführen.

btw machen preProcess ignorieren nicht-numerische Daten ist auf meiner "zu tun" -Liste, aber es könnte zu Fehlern führen für Menschen, die nicht aufpassen.

Max

+1

Ich denke, wir brauchen nur zwei Variablen für PClass. (entweder "pclass1st, pclass2nd" oder "pclass2nd, pclass3rd" oder "pclass3rd, pclass1st"). Wie bei variablem Sex haben wir nur Sexmängel und verworfene Frauen berücksichtigt. Korrigiere mich, wenn es nicht ausreicht. – Sandeep

+0

@topepo, ich denke, die folgende Antwort ignoriert die To-Do-Liste. Ich würde vorschlagen, einige Warnungen für die Leute hinzuzufügen, die nicht aufpassen würden. –

5

Hier ist eine schnelle Möglichkeit, Faktoren auszuschließen oder was auch immer Sie von der Betrachtung möchten:

set.seed(1) 
N <- 20 
dat <- data.frame( 
    x = factor(sample(LETTERS[1:5],N,replace=TRUE)), 
    y = rnorm(N,5,12), 
    z = rnorm(N,-5,17) + runif(N,2,12) 
) 

#' Function which wraps preProcess to exclude factors from the model.matrix 
ppWrapper <- function(x, excludeClasses=c("factor"), ...) { 
    whichToExclude <- sapply(x, function(y) any(sapply(excludeClasses, function(excludeClass) is(y,excludeClass)))) 
    processedMat <- predict(preProcess(x[!whichToExclude], ...), newdata=x[!whichToExclude]) 
    x[!whichToExclude] <- processedMat 
    x 
} 

> ppWrapper(dat) 
    x   y   z 
1 C 1.6173595 -0.44054795 
2 A -0.2933705 -1.98856921 
3 C 1.2177384 0.65420288 
4 D -0.8710374 0.62409408 
5 D -0.4504202 -0.34048640 
6 D -0.6943283 0.24236671 
7 E 0.7778192 0.91606677 
8 D 0.2184563 -0.44935163 
9 C -0.3611408 0.26075970 
10 B -0.7066441 -0.23046073 
11 D -1.5154339 -0.75549761 
12 D 0.4504825 0.38552988 
13 B 1.5692675 0.04093040 
14 C 0.4127541 0.13161807 
15 D 0.5426321 1.09527418 
16 B -2.1040322 -0.04544407 
17 C 0.6928574 1.12090541 
18 B 0.3580960 1.91446230 
19 E 0.3619967 -0.89018040 
20 A -1.2230522 -2.24567237 

Sie alles passieren können Sie in ppWrapper wollen und es wird entlang zu preProcess übergeben bekommen.

+0

Schöne Antwort! Ich denke, Sie sollten das Beispiel verwenden (anstelle eines künstlichen Beispiels, das verwirrend sein könnte). Grundsätzlich, 'Bibliothek (Erde); Daten (etitanic); ppWrapper (etitanic) ' –

Verwandte Themen