2010-08-28 12 views
18

Chciałbym wymusić określone zmienne w regresjach glm bez pełnego określenia każdego z nich. Mój prawdziwy zestaw danych zawiera ~ 200 zmiennych. Nie udało mi się znaleźć próbek tego w moich internetowych poszukiwaniach.Określanie formuły w R z glm bez jawnej deklaracji każdej zmiennej dodatkowej

Na przykład (z zaledwie 3 zmienne):

n=200 
set.seed(39) 
samp = data.frame(W1 = runif(n, min = 0, max = 1), W2=runif(n, min = 0, max = 5)) 
samp = transform(samp, # add A 
A = rbinom(n, 1, 1/(1+exp(-(W1^2-4*W1+1))))) 
samp = transform(samp, # add Y 
Y = rbinom(n, 1,1/(1+exp(-(A-sin(W1^2)+sin(W2^2)*A+10*log(W1)*A+15*log(W2)-1+rnorm(1,mean=0,sd=.25)))))) 

Jeśli chcę obejmują wszystkie główne warunki, to nie ma łatwego skrótu:

glm(Y~., family=binomial, data=samp) 

Ale mówią, że chcą obejmować wszystkie główne warunki (W1, W2 i A) plus W2^2:

glm(Y~A+W1+W2+I(W2^2), family=binomial, data=samp) 

Czy istnieje skrót do tego?

[edytuj własny przed opublikowaniem:] To działa! glm(formula = Y ~ . + I(W2^2), family = binomial, data = samp)

OK, więc co z tym!

Chcę pominąć jeden główny warunki zmienna i obejmują jedynie dwa główne warunki (A, W2) i W2^2 i W2^2::

glm(Y~A+W2+A*I(W2^2), family=binomial, data=samp) 

Oczywiście za pomocą kilku zmiennych bez skrótu naprawdę potrzebne, ale pracuję z wysokimi danymi wymiarowymi. Aktualny zestaw danych zawiera "tylko" 200 zmiennych, ale niektóre inne mają tysiące i tysiące.

+1

Oh wow, tak mi przykro, pojąłem też moje drugie pytanie! glm (Y ~.-W1 + A * I (W2^2), rodzina = dwumianowy, data = samp) Mam nadzieję, że to pomaga komuś innemu, więc nie jest źle mieć go tutaj. –

Odpowiedz

19

Twórcze wykorzystanie metody . do stworzenia formuły zawierającej wszystkie lub prawie wszystkie zmienne jest dobrym i czystym podejściem. Inną opcją, która jest przydatna czasami jest stworzenie formuły programowo jako ciąg znaków, a następnie przekonwertować go do wzoru za pomocą as.formula:

vars <- paste("Var",1:10,sep="") 
fla <- paste("y ~", paste(vars, collapse="+")) 
as.formula(fla) 

Oczywiście, można dokonać drogą fla obiekt bardziej skomplikowana.

13

Aniko udzielił odpowiedzi na pytanie. Aby przedłużyć nieco:

Można również wykluczyć zmiennych używając -:

glm(Y~.-W1+A*I(W2^2), family=binomial, data=samp) 

dla dużych grup zmiennych, często zrobić ramkę do grupowania zmiennych, które pozwala wykonać coś takiego:

vars <- data.frame(
    names = names(samp), 
    main = c(T,F,T,F), 
    quadratic =c(F,T,T,F), 
    main2=c(T,T,F,F), 
    stringsAsFactors=F 
) 


regform <- paste(
    "Y ~", 
    paste(
     paste(vars[vars$main,1],collapse="+"), 
     paste(vars[1,1],paste("*I(",vars[vars$quadratic,1],"^2)"),collapse="+"), 
     sep="+" 
    ) 
) 
> regform 
[1] "Y ~ W1+A+W1 *I(W2 ^2)+W1 *I(A ^2)" 

> glm(as.formula(regform),data=samp,family=binomial) 

Korzystanie z wszystkich warunków (na nazwę, na strukturę, cokolwiek), aby wypełnić ramkę danych, pozwala mi szybko wybrać grupy zmiennych w dużych zestawach danych.