2013-08-16 22 views
5

Chciałbym policzyć liczbę zmiennych, które wchodzą w prawą stronę formuły. Czy istnieje funkcja, która to robi?Zliczanie zmiennych w formule

Na przykład

y<-rnorm(100) 
x1<-rnorm(100) 
x2<-rnorm(100) 
x3<-rnorm(100) 
f<-formula(y~x1+x2+x3) 

Następnie by zadzwonić SomeFunction(f) która zwrócona 3 (od 3 x są zmienne z prawej strony równania). Czy SomeFunction istnieje?

Odpowiedz

0

Jeśli chcesz policzyć liczbę szacowanych parametrów, jak sugeruje swoim komentarzu poniżej odpowiedź G. Grothendiecka, można spróbuj kodu poniżej. Dodałem jeden do n.coefficients dla terminu błędu, tak jak w przypadku AIC.

n  <- 20          # number of observations 
B0  <- 2          # intercept 
B1  <- -1.5          # slope 1 
B2  <- 0.5          # slope 2 
B3  <- -2.5          # slope 3 
sigma2 <- 5          # residual variance 

x1  <- sample(1:3, n, replace=TRUE)    # categorical covariate 
x12 <- ifelse(x1==2, 1, 0) 
x13 <- ifelse(x1==3, 1, 0) 
x3  <- round(runif(n, -5 , 5), digits = 3)  # continuous covariate 
eps <- rnorm(n, mean = 0, sd = sqrt(sigma2)) # error 
y  <- B0 + B1*x12 + B2*x13 + B3*x3 + eps  # dependent variable 
x1  <- as.factor(x1) 

model1 <- lm(y ~ x1 + x3)       # linear regression 
model1 

summary(model1) 

n.coefficients <- as.numeric(sapply(model1, length)[1]) + 1 
n.coefficients 

# [1] 5 

Tutaj jest bardziej prosta alternatywa dla kodu dla n.coefficients:

n.coefficients2 <- length(model1$coefficients) + 1 
n.coefficients2 

# [1] 5 
+2

Pytanie dotyczy formuły, a nie modelu. –

7

Konieczne może być obejrzenie niektórych powiązanych funkcji dostępnych na stronie pomocy pod adresem formula. W szczególności terms:

> terms(f) 
y ~ x1 + x2 + x3 + x4 
attr(,"variables") 
list(y, x1, x2, x3, x4) 
attr(,"factors") 
    x1 x2 x3 x4 
y 0 0 0 0 
x1 1 0 0 0 
x2 0 1 0 0 
x3 0 0 1 0 
x4 0 0 0 1 
attr(,"term.labels") 
[1] "x1" "x2" "x3" "x4" 
attr(,"order") 
[1] 1 1 1 1 
attr(,"intercept") 
[1] 1 
attr(,"response") 
[1] 1 
attr(,".Environment") 
<environment: R_GlobalEnv> 

Uwaga atrybut "term.labels".

5

Oto dwie możliwości:

length(attr(terms(f), "term.labels")) 

length(all.vars(update(f, z ~.))) - 1 
+0

Dziękujemy! Jednak jeśli uwzględnię zmienną czynnikową, liczy się ona tylko jako jedna. Czy jest jakiś sposób obejścia tego? Na przykład: dla f <-formula (czynnik y ~ x + (miesiące)), to by zwróciło 2. Chciałbym, żeby powrócił 13 (jeden za x, plus 12 miesięcy).Albo jeszcze lepiej byłoby, gdyby powrócił 12 (jeden za x, 12 miesięcy minus jeden, ponieważ jeden czynnik miesiąca wypadłby z regresji liniowej). – BUML1290

+4

To jest inne pytanie niż pytanie zadane w poście. –

+0

@ BUML1290 Musisz zaktualizować swoje pytanie, aby uzyskać odpowiedź na temat czynników w formule. – djhurio

1

W świetle Twojego komentarza, może to zależeć od tego, jak jesteś dopasowania modelu ...

W przypadku modelu liniowego, te odpowiedzi wszystko dać 12:

set.seed(1) 
df1 <- data.frame (y=rnorm(100), 
        x=rnorm(100), 
        months=sample(letters[1:12], replace=TRUE, size=100)) 
f1 <-formula(y~x+factor(months)) 
l1 <- lm(f1, data=df1) 
ncol(l1$qr$qr)-1 

lub

length(colnames(l1$qr$qr))-1 

Tutaj qr to QR decomposition of a matrix używany do dopasowania modelu. Będzie zawierał nie. parametrów zainteresowania.

Można również dowiedzieć się, jakie zmienne czynniki od model.frame, takie jak:

length(unique(model.frame(l1)[["factor(months)"]])) 

lub bardziej ogólnie z .getXlevels, które dadzą Ci listę unikatowych wartości dla każdego czynnika po stronie predykcyjnej, jak w:

length(stats::.getXlevels(terms(l1), model.frame(l1))[[1]]) 

Aktualizacja

@Mark Miller szczekał lepsze drzewo. Jeśli twój model ma dostępną metodę typu AIC, powinieneś być w stanie go użyć, aby uzyskać nr. parametrów. Dla lm, to ukryty sposób S3 w stats, więc nazwać tak:

stats:::extractAIC.lm(l1)[[1]] -1