2014-11-12 12 views
5

mam model z transformowanych zmiennych, npusunąć zmienną owinięty w zależności od modelu wzorze w R

data = data.frame(y = runif(100,0,10), x1 = runif(100,0,10), x2 = runif(100, 0, 10)) 
mod = lm(y ~ scale(x1) + scale(x2), data) 

ja chce usunąć całą jedną zmienną, na podstawie wzoru, tak jak poniżej:

mod = lm(y ~ scale(x1), # x2 is gone! 
data) 

Ale chciałbym to zrobić za pomocą dostarczonego przez użytkownika ciągu znaków zmiennej, która ma zostać usunięta (innymi słowy, zawijam to w funkcję i nie można edytować formuły ręcznie, jak mam tutaj).

Jeśli zmienna była nietransformowanego, to byłoby proste używając gsub:

remove.var = "x2" 
update(mod, formula. = as.formula(gsub(remove.var, "", format(formula(mod))))) 

ale jako taki, zwraca całkowicie przewidywalny błąd:

> Error in as.matrix(x) : argument "x" is missing, with no default 

ponieważ scale() jest nadal w formule!

Czy istnieje sposób, aby to zrobić z regexpr, lub w jakiś sposób, że nie widzę, że jest całkowicie oczywiste? Chciałbym, aby był skalowalny do innych typów transformacji, np .: log, log10 itd.

W innej warstwy złożoności, załóżmy, że zmienna jest usuwana również pojawiła się w interakcji:

mod = lm(y ~ scale(x1) * scale(x2), data) 

W tym przypadku trzeba by usuwać interakcję * oraz (błędny + s, znalazłem, są ok).

Każda pomoc jest doceniana. Dzięki!

+0

To niby wydaje się jak masz zamiar to do tyłu. W jaki sposób budujesz formułę? Próba usunięcia części (lub funkcji części lub interakcji z częściami) może być dość skomplikowana po fakcie. Wygląda na to, że powinieneś po prostu zbudować formułę na podstawie danych wprowadzanych bezpośrednio przez użytkownika. – MrFlick

Odpowiedz

3

Warunków-obiekt jest formuła z dodatkowymi atrybutami:

update(mod, formula=drop.terms(mod$terms, 2, keep.response=TRUE) ) 

Call: 
lm(formula = y ~ scale(x1), data = data) 

Coefficients: 
(Intercept) scale(x1) 
    5.0121  0.1236 

Jeśli trzeba obliczyć tę pozycję z argumencie, wtedy można grep atrybut term.labels:

> grep("x2", attr(mod$terms, "term.labels")) 
[1] 2 

Zauważ, że to również się uda z formułą interakcji:

update(mod, formula=drop.terms(mod$terms, grep("x2", attr(mod$terms, "term.labels")), keep.response=TRUE)) 
#---------- 

Call: 
lm(formula = y ~ scale(x1), data = data) 

Coefficients: 
(Intercept) scale(x1) 
    5.0121  0.1236 
+0

Świetne, dzięki! – jslefche

0

Jestem pewien, że Re inny sposób to zrobić z pakietem caret, ale myślę, że robi to, co chcesz:

vars<- c("tom", "dick", "harry") 
remove<- "tom" 
vars<- setdiff(vars, remove) 

formula <- as.formula(paste("y ~", paste("scale(", vars, ")", collapse = "+"))) 
Powiązane problemy