2016-07-30 5 views
3

Ich gehe von Stata zu R über. Wenn ich in Stata Faktorstufen (zB - 0 und 1) zu (M und F) beschreibe, würden 0 und 1 so bleiben, wie sie sind. Darüber hinaus ist dies für die lineare lineare Regression von Variablen in den meisten Programmen wie Excel und SPSS erforderlich.Faktorstufen sind standardmäßig auf 1 und 2 in R | Dummy-Variable

Allerdings habe ich bemerkt, dass R Standard Faktor Ebenen auf 1,2 statt 0,1. Ich weiß nicht, warum R dies tut, obwohl die Regression intern (und korrekt) 0 und 1 als Faktorvariable annimmt. Ich würde jede Hilfe schätzen. Ich glaube, 1 und 2 s sind Verweise auf den Faktor Ebene

sex<-c(0,1,0,1,1) 
sex<-factor(sex,levels = c(1,0),labels = c("F","M")) 
str(sex) 
Factor w/ 2 levels "F","M": 2 1 2 1 1 

es, dass Faktorstufen 1 und 2 zurückgesetzt werden jetzt scheint:

Hier ist, was ich getan habe:

Versuch # 1 Hier. Ich habe jedoch die ursprünglichen Werte, d. H. 0s und 1s, verloren.

Try2:

sex<-c(0,1,0,1,1) 
sex<-factor(sex,levels = c(0,1),labels = c("F","M")) 
str(sex) 
Factor w/ 2 levels "F","M": 1 2 1 2 2 

Ditto. Meine 0 und 1 sind jetzt 1 und 2. Ziemlich überraschend. Warum passiert dies.

Try3 Jetzt wollte ich sehen, ob 1s und 2s irgendeine negative Regression haben. So, hier ist was ich getan habe:

Hier ist, was meine Daten wie folgt aussieht:

> head(data.frame(sassign$total_,sassign$gender)) 
    sassign.total_ sassign.gender 
1   357    M 
2   138    M 
3   172    F 
4   272    F 
5   149    F 
6   113    F 

myfit<-lm(sassign$total_ ~ sassign$gender) 

myfit$coefficients 
    (Intercept) sassign$genderM 
     200.63522  23.00606 

Also, es stellt sich heraus, dass die Mittel korrekt sind. Beim Ausführen der Regression verwendete R 0 und 1 als Dummies.

Ich habe andere Threads auf SO überprüft, aber sie sprechen meist darüber, wie R-Codes Variable Variablen, ohne mir zu sagen, warum. Stata und SPSS erfordern im Allgemeinen, dass die Basisvariable "0" ist. Also dachte ich darüber nach zu fragen.

Ich würde mich über irgendwelche Gedanken freuen.

Antwort

5

Kurz gesagt, Sie vermischen nur zwei verschiedene Konzepte. Ich werde sie im Folgenden einzeln erklären.


Die Bedeutung von ganzen Zahlen Sie

in str() sehen, was Sie von str() sehen, ist die interne Darstellung einer Faktorvariablen. Ein Faktor ist intern eine Ganzzahl, wobei die Zahl die Position der Ebenen innerhalb des Vektors angibt.Zum Beispiel:

x <- gl(3, 2, labels = letters[1:3]) 
#[1] a a b b c c 
#Levels: a b c 

storage.mode(x) ## or `typeof(x)` 
#[1] "integer" 

str(x) 
# Factor w/ 3 levels "a","b","c": 1 1 2 2 3 3 

as.integer(x) 
#[1] 1 1 2 2 3 3 

levels(x) 
#[1] "a" "b" "c" 

Eine häufige Verwendung solcher Positionen ist as.character(x) auf die effizienteste Art und Weise auszuführen:

levels(x)[x] 
#[1] "a" "a" "b" "b" "c" "c" 

Ihr Missverständnis dessen, was eine Modellmatrix sieht aus wie

Es scheint mir, dass Sie dachten, dass eine Modellmatrix von

erhalten wird
cbind(1L, as.integer(x)) 
#  [,1] [,2] 
#[1,] 1 1 
#[2,] 1 1 
#[3,] 1 2 
#[4,] 1 2 
#[5,] 1 3 
#[6,] 1 3 

was nicht stimmt. Auf diese Weise behandeln Sie nur eine Faktorvariable als numerische Variable.

die Modellmatrix ist auf diese Weise konstruiert:

xlevels <- levels(x) 
cbind(1L, match(x, xlevels[2], nomatch=0), match(x, xlevels[3], nomatch=0)) 
#  [,1] [,2] [,3] 
#[1,] 1 0 0 
#[2,] 1 0 0 
#[3,] 1 1 0 
#[4,] 1 1 0 
#[5,] 1 0 1 
#[6,] 1 0 1 

Die 10 und bedeuten "match"/"Auftreten" und "No-Match"/"no-Eintreten" bezeichnet.

Die R Routine model.matrix diese effizient für Sie tun, mit leicht zu lesenden Spaltennamen und Zeilennamen:

model.matrix(~x) 
# (Intercept) xb xc 
#1   1 0 0 
#2   1 0 0 
#3   1 1 0 
#4   1 1 0 
#5   1 0 1 
#6   1 0 1 

eine R-Funktion schreiben uns eine Modellmatrix zu erzeugen

Wir könnten eine nominale Routine mm schreiben, um eine Modellmatrix zu erzeugen. Obwohl es viel weniger effizient als model.matrix ist, kann es helfen, dieses Konzept besser zu verdauen.

mm <- function (x, contrast = TRUE) { 
    xlevels <- levels(x) 
    lst <- lapply(xlevels, function (z) match(x, z, nomatch = 0L)) 
    if (contrast) do.call("cbind", c(list(1L), lst[-1])) 
    else do.call("cbind", lst) 
    } 

Zum Beispiel, wenn wir einen Faktor y mit 5 Stufen haben:

set.seed(1); y <- factor(sample(1:5, 10, replace=TRUE), labels = letters[1:5]) 
y 
# [1] b b c e b e e d d a 
#Levels: a b c d e 
str(y) 
#Factor w/ 5 levels "a","b","c","d",..: 2 2 3 5 2 5 5 4 4 1 

Seine Modellmatrix mit/ohne Kontrast Behandlung ist jeweils:

mm(y, TRUE) 
#  [,1] [,2] [,3] [,4] [,5] 
# [1,] 1 1 0 0 0 
# [2,] 1 1 0 0 0 
# [3,] 1 0 1 0 0 
# [4,] 1 0 0 0 1 
# [5,] 1 1 0 0 0 
# [6,] 1 0 0 0 1 
# [7,] 1 0 0 0 1 
# [8,] 1 0 0 1 0 
# [9,] 1 0 0 1 0 
#[10,] 1 0 0 0 0 

mm(y, FALSE) 
#  [,1] [,2] [,3] [,4] [,5] 
# [1,] 0 1 0 0 0 
# [2,] 0 1 0 0 0 
# [3,] 0 0 1 0 0 
# [4,] 0 0 0 0 1 
# [5,] 0 1 0 0 0 
# [6,] 0 0 0 0 1 
# [7,] 0 0 0 0 1 
# [8,] 0 0 0 1 0 
# [9,] 0 0 0 1 0 
#[10,] 1 0 0 0 0 

Der entsprechende model.matrix Anruf wird sein:

model.matrix(~ y) 
model.matrix(~ y - 1) 
+1

Dank Zheyuan für Ihre Hilfe, aber ich bin mir nicht ganz sicher, warum R dies tut, da die meisten Statistiken Bücher/Gemeinschaft über Dummy-Variablen (0 Codierung usw.) lehren. Als Anfänger war das verwirrend für mich. Ich denke, das Endergebnis ist, dass R sich von Stata und anderen Tools unterscheidet. Wir müssen es einfach akzeptieren. – watchtower

+1

@watchtower Der wichtigste Punkt, an den man sich erinnert, ist, dass die Darstellung eines Faktors in einem Datenrahmen unabhängig davon ist, wie er in einer Modellmatrix behandelt wird. Dummy-Variablen sind nur eine Möglichkeit, einen Faktor zu kodieren; Siehe "Kontraste" für die verfügbaren Optionen. –

+1

Danke Zheyuan. Das ist mir jetzt klar. Ich schätze es. – watchtower

8

R ist nicht Stata. Und Sie werden eine Menge von dem, was Sie über die Dummy-Variable Konstruktion gelernt haben, verlernen müssen. R macht es hinter den Kulissen für dich. Sie können R nicht genau wie Stata verhalten lassen. Wahr, R hatte 0 und 1 'in der Modellmatrixspalte für das "F" -Niveau, aber diese werden mit den Faktorwerten multipliziert (in diesem Fall 1 und 2). Kontraste sind jedoch immer Unterschiede und der Unterschied btwn (0,1) ist derselbe wie der Unterschied btwn (1,2).

ein Datenbeispiel:

dput(dat) 
structure(list(total = c(357L, 138L, 172L, 272L, 149L, 113L), 
    gender = structure(c(2L, 2L, 1L, 1L, 1L, 1L), .Label = c("F", 
    "M"), class = "factor")), .Names = c("total", "gender"), row.names = c("1", 
"2", "3", "4", "5", "6"), class = "data.frame") 

Diese beiden Regressionsmodelle haben unterschiedliche Matrices Modell (Modell R Matrizen sind, wie ihre „Dummy-Variablen-Konstrukten.

> myfit<-lm(total ~ gender, dat) 
> 
> myfit$coefficients 
(Intercept)  genderM 
     176.5  71.0 
> dat$gender=factor(dat$gender, levels=c("M","F")) 
> myfit<-lm(total ~ gender, dat) 
> 
> myfit$coefficients 
(Intercept)  genderF 
     247.5  -71.0 
> model.matrix(myfit) 
    (Intercept) genderF 
1   1  0 
2   1  0 
3   1  1 
4   1  1 
5   1  1 
6   1  1 
attr(,"assign") 
[1] 0 1 
attr(,"contrasts") 
attr(,"contrasts")$gender 
[1] "contr.treatment" 

> dat$gender=factor(dat$gender, levels=c("F","M")) 
> myfit<-lm(total ~ gender, dat) 
> 
> myfit$coefficients 
(Intercept)  genderM 
     176.5  71.0 
> model.matrix(myfit) 
    (Intercept) genderM 
1   1  1 
2   1  1 
3   1  0 
4   1  0 
5   1  0 
6   1  0 
attr(,"assign") 
[1] 0 1 
attr(,"contrasts") 
attr(,"contrasts")$gender 
[1] "contr.treatment" 
+0

Danke 42. Ich schätze es wirklich. Das war sehr hilfreich. – watchtower

Verwandte Themen