2013-08-16 39 views
5

Tôi muốn đếm số biến mà nhập vào bên phải của công thức. Có chức năng nào không?Đếm biến số trong một công thức

Ví dụ:

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

Sau đó, tôi sẽ gọi SomeFunction(f) mà sẽ trả lại 3 (vì có 3 x biến ở phía bên tay phải của phương trình). Có một số chức năng tồn tại?

Trả lời

0

Nếu bạn muốn đếm số lượng các thông số ước tính, theo đề nghị của bình luận của bạn dưới đây câu trả lời của G. Grothendieck, bạn có thể hãy thử mã dưới đây. Tôi đã thêm một số vào n.coefficients cho thời hạn lỗi, như được thực hiện với 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 

Đây là một thay thế thẳng về phía trước hơn để mã cho n.coefficients:

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

# [1] 5 
+2

Câu hỏi hỏi về một công thức, không phải là một mô hình. –

7

Bạn có thể cần xem xét một số chức năng liên quan được liên kết trong trang trợ giúp cho formula. Cụ thể, 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> 

Lưu ý thuộc tính "term.labels".

5

Dưới đây là hai khả năng:

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

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

Cảm ơn bạn! Tuy nhiên, nếu tôi bao gồm một biến yếu tố, nó chỉ được tính là một biến. Có cách nào để khắc phục điều này? Ví dụ: đối với f <-formula (y ~ x + factor (tháng)), điều này sẽ trả về 2. Tôi muốn nó trả về 13 (một cho x, cộng thêm 12 tháng).Hoặc, thậm chí tốt hơn sẽ cho nó để trở về 12 (một cho x, 12 tháng trừ một kể từ một yếu tố tháng sẽ giảm ra khỏi một hồi quy tuyến tính). – BUML1290

+4

Đó là một câu hỏi khác với câu hỏi bạn đã đặt trong bài đăng. –

+0

@ BUML1290 Bạn cần cập nhật câu hỏi của mình để nhận câu trả lời về các yếu tố trong công thức. – djhurio

1

Trong ánh sáng của bình luận của bạn, điều này có thể phụ thuộc vào cách bạn đang lắp mô hình ...

Trong trường hợp của một mô hình tuyến tính, những câu trả lời tất cả cho 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 

hoặc

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

Ở đây qrQR decomposition of a matrix được sử dụng để lắp mô hình. Nó sẽ chứa không. các thông số quan tâm.

Bạn cũng có thể tìm thấy trong đó các biến là những yếu tố từ model.frame, chẳng hạn như:

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

Hoặc tổng quát hơn với .getXlevels, mà sẽ cung cấp cho bạn một danh sách các giá trị duy nhất cho mỗi yếu tố ở phía bên dự đoán, như trong:

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

cập nhật

@ Mark Miller đã sủa lên một cái cây tốt hơn. Nếu mô hình của bạn có sẵn phương thức kiểu AIC, bạn sẽ có thể sử dụng phương thức này để nhận số không. các thông số. Đối với một lm, đó là một phương pháp S3 ẩn trong stats, vì vậy gọi nó là như thế này:

stats:::extractAIC.lm(l1)[[1]] -1 
Các vấn đề liên quan