Cách viết công thức mô hình tuyến tính với 100 biến trong R


22

Có cách nào dễ dàng trong R để tạo hồi quy tuyến tính trên mô hình có 100 tham số trong R không? Giả sử chúng ta có một vectơ Y có 10 giá trị và khung dữ liệu X có 10 cột và 100 hàng Trong ký hiệu toán học tôi sẽ viết Y = X[[1]] + X[[2]] + ... + X[[100]]. Làm thế nào để tôi viết một cái gì đó tương tự trong cú pháp R?


1
Có 100 hay 1000 không? Ngoài ra, thông thường bạn sẽ có các cột là các biến và các hàng là các quan sát (có vẻ như được đảo ngược ở đây)
Macro

100 số 0 thêm là một lỗi đánh máy
Christian

2
Có thật không? Bạn có chắc chắn muốn làm điều này? Tôi lo ngại về việc quá mức và mối tương quan giữa các kết hợp tuyến tính của các yếu tố dự đoán. Không chỉ vậy, với 100 dự đoán mà chỉ có 10 quan sát, bạn có và hồi quy tuyến tính hoàn toàn không hoạt động. p>n
Aaron - Phục hồi Monica

Câu trả lời:


29

Thử đi

df<-data.frame(y=rnorm(10),x1=rnorm(10),x2=rnorm(10))
lm(y~.,df)

4
Và nếu bạn muốn, giả sử, tất cả các tương tác bậc hai, bạn có thể viết y ~ . + .^2. Và như vậy.
Lutz Prechelt

3
Và nếu bạn chỉ muốn một số tương tác thứ hai, một cái gì đó giống như y ~ . + .:x1sẽ giúp bạn có các tương tác của từng biến (ngoại trừ x1) với x1. Và như vậy; bạn có được ý tưởng
Lutz Prechelt

21

Câu trả lời tuyệt vời!

Tôi sẽ thêm nó theo mặc định, gọi formulamột data.framecông thức phụ gia để hồi quy cột đầu tiên lên các cột khác.

Vì vậy, trong trường hợp câu trả lời của @ danas.zuokas, bạn thậm chí có thể làm

lm(df)

được giải thích chính xác.


Tuy nhiên, câu trả lời này không hoạt động nếu bạn muốn kết hợp các thuật ngữ tương tác. Bạn làm (+1).
gui11aume

6
Tôi liên tục ngạc nhiên về việc hầu hết các Rnhà khai thác bị quá tải :)
Macro

19

YnXn×pp= =100

Z = as.data.frame(cbind(Y,X))
lm(Y ~ .,data=Z)

Nếu có các cột khác mà bạn không muốn đưa vào làm dự đoán, bạn sẽ phải xóa chúng khỏi Xtrước khi sử dụng thủ thuật này hoặc sử dụng -trong công thức mô hình để loại trừ chúng. Ví dụ: nếu bạn muốn loại trừ dự đoán thứ 67 (có tên tương ứng x67), thì bạn có thể viết

lm(Y ~ .-x67,data=Z)

Ngoài ra, nếu bạn muốn bao gồm các tương tác, v.v., bạn sẽ cần thêm chúng theo cách thủ công như (ví dụ)

lm(Y ~ .+X[,1]*X[,2],data=Z)

hoặc đảm bảo chúng được nhập dưới dạng cột của X.


19

Bạn cũng có thể sử dụng kết hợp các chức năng formulapaste.

Dữ liệu thiết lập : Hãy tưởng tượng chúng ta có một data.frame có chứa các biến dự đoán x1đến x100và biến phụ thuộc của chúng ta y, nhưng đó cũng là một biến phiền toái asdfasdf. Ngoài ra, các biến dự đoán được sắp xếp theo thứ tự sao cho chúng không liền kề nhau trong data.frame.

Data <- data.frame(matrix(rnorm(102 * 200), ncol=102))
names(Data) <- c(paste("x", 1:50, sep=""), 
    "asdfasdf", "y", paste("x", 51:100, sep=""))

Cũng hãy tưởng tượng rằng bạn có một chuỗi chứa tên của các biến dự đoán. Trong trường hợp này, điều này có thể dễ dàng được tạo bằng cách sử dụng pastehàm, nhưng trong các tình huống khác, grephoặc một số cách tiếp cận khác có thể được sử dụng để có được chuỗi này.

PredictorVariables <- paste("x", 1:100, sep="")

Áp dụng phương pháp : Sau đó chúng ta có thể xây dựng một công thức như sau:

Formula <- formula(paste("y ~ ", 
     paste(PredictorVariables, collapse=" + ")))
lm(Formula, Data)
  • các collapsechèn tranh luận +giữa các biến dự đoán
  • formulachuyển đổi chuỗi thành một đối tượng của công thức lớp phù hợp với lmhàm.

Tổng quát hơn, tôi sử dụng hàm sau khá thường xuyên khi tôi muốn cung cấp một biến dự đoán dưới dạng vectơ của tên biến.

regression <- function(dv, ivs, data) {
    # run a linear model with text arguments for dv and ivs
    iv_string <- paste(ivs, collapse=" + ")
    regression_formula <- as.formula(paste(dv, iv_string, sep=" ~ "))
    lm(regression_formula, data)

}

Ví dụ,

regression("y", PredictorVariables, Data)

2
+1. Tôi sử dụng kỹ thuật này tất cả các thời gian. Tuy nhiên, đôi khi, có công thức được lưu trữ trong một biến gây ra vấn đề. Xem stackoverflow.com/a/7668846/210673 để sử dụng do.callđánh giá công thức trước khi gọi lm.
Aaron - Phục hồi Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.