2012-07-21 5 views
6

Ich habe viele Formeln (der Klasse formula oder Formula) der Form y ~ a*b, wo a und b Faktoren sind.Erweiterung Faktor Wechselwirkungen innerhalb einer Formel

Ich muss eine Funktion schreiben, die eine solche Formel nimmt und eine Formel mit allen Begriffen in der Interaktion "geschrieben" zurückgibt. Hier ein Beispiel:

fac1 <- factor(c('a', 'a', 'b', 'b')) 
fac2 <- factor(c('c', 'd', 'c', 'd')) 
BigFormula(formula(x ~ fac1*fac2)) 

wo BigFormula kehrt formula(x ~ a + b + c + d + a:c + a:d + b:c + b:d).

Gibt es eine einfache Möglichkeit, dies zu tun?

(Der Kontext: Ich habe viele Befehle der Form anova(mod1, mod2), wo mod2 Nester in mod1, und wo die rechte Seite der beiden Modelle enthält Begriffe wie fac1*fac2 leite Der Punkt dieser Befehle ist F-Statistik zu berechnen. Das Problem ist, dass anovafac1*fac2 als drei Variablen behandelt, obwohl es normalerweise mehr als drei Variablen darstellt. (Im obigen Code stellt beispielsweise fac1*fac2 acht Variablen dar.) Unterschätzt anova die Anzahl der Einschränkungen im verschachtelten Modell, und es überschätzt meine Freiheitsgrade.)

Antwort

2

Wie wäre es mit der folgenden Lösung? Ich benutze ein extremeres Beispiel für eine komplexe Interaktion.

f = formula(y ~ a * b * c * d * e)

Um die Interaktionsbedingungen zu formulieren, die Begriffe aus dem Wert von Begriffen zurück extrahieren.Formel():

terms = attr(terms.formula(f), "term.labels")

, die ergibt:

> terms 
[1] "a"   "b"   "c"   "d"   "e"   "a:b"  "a:c"  
[8] "b:c"  "a:d"  "b:d"  "c:d"  "a:e"  "b:e"  "c:e"  
[15] "d:e"  "a:b:c"  "a:b:d"  "a:c:d"  "b:c:d"  "a:b:e"  "a:c:e"  
[22] "b:c:e"  "a:d:e"  "b:d:e"  "c:d:e"  "a:b:c:d" "a:b:c:e" "a:b:d:e" 
[29] "a:c:d:e" "b:c:d:e" "a:b:c:d:e" 

Und dann können wir es wieder in eine Formel konvertieren:

f = as.formula(sprintf("y ~ %s", paste(terms, collapse="+")))

> f 
y ~ a + b + c + d + e + a:b + a:c + b:c + a:d + b:d + c:d + a:e + 
    b:e + c:e + d:e + a:b:c + a:b:d + a:c:d + b:c:d + a:b:e + 
    a:c:e + b:c:e + a:d:e + b:d:e + c:d:e + a:b:c:d + a:b:c:e + 
    a:b:d:e + a:c:d:e + b:c:d:e + a:b:c:d:e 
0

Wir haben ähnliches Problem, aber etwas einfacher - In der Formel haben wir 50 Variablen bekommen und wir mussten sie sehr oft ändern; Unsere Lösung war, innerhalb von R-Skript senden sie in einer Schleife an externe Datei eigentliche Formel dann einfach zu lesen, dass TXT-Datei und fügen Sie es; so weit ich mich erinnere, könnte es in der verschachtelten Schleife getan werden, um mehr Formeln zu machen, dann lies die Datei Zeile für Zeile zurück; alles in allem ist es immer gut, beide R-Skripte und Bash

7

Verwenden Sie die Hilfe für formula gibt es möglicherweise vorhandene Dinge, die für Sie arbeiten.

Zum Beispiel die Formel y ~ (a + b + c + d)^2 wird Ihnen alle Haupteffekte und alle 2-Wege-Interaktionen und die Formel y ~ (a + b) * (c + d) gibt die Erweiterung, die Sie oben zeigen. Sie können auch Begriffe subtrahieren, so dass y ~ a*b*c - a:b:c die 3-Wege-Interaktion nicht enthält.

3

Ich habe noch noch alle Tricks der Formel zu lernen, aber wenn ich explizite Formeln wollen werde ich dazu neigen, sapply zusammen mit dem Einfügen zu verwenden:

# the factors 
fac1 <- factor(c('a', 'a', 'b', 'b')) 
fac2 <- factor(c('c', 'd', 'c', 'd')) 

# create all the interaction terms 
out <- sapply(levels(fac1), function(ii) { 
    sapply(levels(fac2), function(jj) { 
    paste0(ii,":",jj) 
    }) 
}) 
# along with the single terms 
terms <- c(levels(fac1), levels(fac2), as.vector(out)) 

# and create the rhs of the formula 
rhs <- paste0(terms, collapse=" + ") 

# finally add the lhs 
f <- paste0("x ~ ", rhs) 

Wir am Ende mit:

> f 
[1] "x ~ a + b + c + d + a:c + a:d + b:c + b:d" 
Verwandte Themen