2013-05-16 9 views
6

W R obiekt formuły ma charakter symboliczny i wydaje się dość trudny do analizy. Jednak trzeba analizować taką formułę do wyraźnego zestaw etykiet do stosowania na zewnątrz R.Użycie R do interpretacji symbolicznej formuły do ​​użytku zewnętrznego

(1)

Pozwalając f stanowią model formulae, w którym reakcji nie jest określona, ​​np ~V1 + V2 + V3, jedno próbowałem było:

t <- terms(f) 
attr(t, "term.labels") 

Jednak to nie jest dokładnie to, czego wyraźny jeśli niektóre zmienne w f są kategoryczne. Na przykład, niech V1 będzie zmienną kategoryczną z 2 kategoriami, tj. Boolean, i niech V2 będzie podwójną.

Dlatego model określony przez ~V1:V2 powinien mieć 2 parametry: "przecięcie" i "xyes: z". Tymczasem model określony przez ~V1:V2 - 1 powinien mieć parametry "xno: z" i "xyes: z". Jednak bez możliwości określenia funkcji, które zmienne są kategoryczne (i ile kategorii) nie ma możliwości ich interpretacji. Zamiast tego ma po prostu V1:V2 w swoich "terms.labels", co nie oznacza nic w kontekście, że V1 jest kategoryczny.

(2)

Z drugiej strony, przy użyciu model.matrix to łatwy sposób, aby uzyskać dokładnie to, co chcę. Problem polega na tym, że wymaga on argumentu, który jest dla mnie zły, ponieważ chcę tylko wyraźnej interpretacji symbolicznej formuły do ​​użycia poza R. Ta metoda uzyskiwania tego będzie marnować dużo czasu (względnie), ponieważ R musi czytać dane z zewnętrznego źródła, gdy wszystko, co naprawdę musi wiedzieć, to: które zmienne są kategoryczne (i ile kategorii) oraz które zmienne są podwajane.

Czy istnieje sposób użycia parametru "model.matrix" wyłącznie z określeniem typów danych, a nie rzeczywistymi danymi? Jeśli nie, to co jeszcze jest realnym rozwiązaniem?

Odpowiedz

4

Cóż, tylko w kontekście posiadania danych można określić, czy daną zmienną jest czynnik czy cyfra. Więc nie możesz tego zrobić bez argumentu danych. Ale wszystko, czego potrzebujesz, to struktura, a nie same dane, więc możesz użyć ramki danych z zerowym rzędem z kolumnami wszystkich właściwych typów.

f <- ~ V1:V2 
V1numeric <- data.frame(V1=numeric(0), V2=numeric(0)) 
V1factor <- data.frame(V1=factor(c(), levels=c("no","yes")), V2=numeric(0)) 

Patrząc na dwóch data.frames:

> V1numeric 
[1] V1 V2 
<0 rows> (or 0-length row.names) 
> str(V1numeric) 
'data.frame': 0 obs. of 2 variables: 
$ V1: num 
$ V2: num 
> V1factor 
[1] V1 V2 
<0 rows> (or 0-length row.names) 
> str(V1factor) 
'data.frame': 0 obs. of 2 variables: 
$ V1: Factor w/ 2 levels "no","yes": 
$ V2: num 

Korzystając model.matrix z nich

> model.matrix(f, data=V1numeric) 
    (Intercept) V1:V2 
attr(,"assign") 
[1] 0 1 
> model.matrix(f, data=V1factor) 
    (Intercept) V1no:V2 V1yes:V2 
attr(,"assign") 
[1] 0 1 1 
attr(,"contrasts") 
attr(,"contrasts")$V1 
[1] "contr.treatment" 

Jeśli masz prawdziwy zestaw danych, nie jest łatwo dostać 0-wiersz data.frame z tego, co zachowuje informacje o kolumnie. Po prostu indeksuj go za pomocą FALSE. Nie musisz budować danych.frame ręcznie, jeśli masz taką z właściwymi właściwościami.

> str(mtcars) 
'data.frame': 32 obs. of 11 variables: 
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... 
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ... 
$ disp: num 160 160 108 258 360 ... 
$ hp : num 110 110 93 110 175 105 245 62 95 123 ... 
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... 
$ wt : num 2.62 2.88 2.32 3.21 3.44 ... 
$ qsec: num 16.5 17 18.6 19.4 17 ... 
$ vs : num 0 0 1 1 0 1 0 1 1 1 ... 
$ am : num 1 1 1 0 0 0 0 0 0 0 ... 
$ gear: num 4 4 4 3 3 3 3 4 4 4 ... 
$ carb: num 4 4 1 1 2 1 4 2 2 4 ... 
> str(mtcars[FALSE,]) 
'data.frame': 0 obs. of 11 variables: 
$ mpg : num 
$ cyl : num 
$ disp: num 
$ hp : num 
$ drat: num 
$ wt : num 
$ qsec: num 
$ vs : num 
$ am : num 
$ gear: num 
$ carb: num 
+0

Dzięki za szybką odpowiedź. Mam prawdziwy zestaw danych, ale jest duży i poza R, więc czytanie go zmniejsza wydajność. To, co masz w pierwszej części, wygląda świetnie, ale jedną rzeczą, której nie rozumiem, jest to, że 'model.matrix (f, data = V1Factor)' tworzy 3 odpowiednie parametry, kiedy nie powinno mieć 'V1no: V2' jak tam jest punktem przecięcia. –

+0

R jest niechętne do usuwania parametrów niższego rzędu, gdy są obecne interakcje, być może dlatego: http://stackoverflow.com/q/11335923/289572 – Henrik

+0

@JonClaus Myślę, że powinien on mieć trzy parametry: punkt przecięcia, nachylenie "V2", gdy "V1" to nie, a nachylenie "V2", gdy "V1" jest tak (sposób tutaj parametryzowany). Można również uzyskać 3 parametry z punktem przecięcia, nachylenie 'V2', gdy' V1' jest nie, oraz zmiana nachylenia 'V2', gdy' V1' zmieni się z nie na tak. Jednak podczas parametryzacji istnieją 3 parametry. –

Powiązane problemy