Cara menulis rumus model linier dengan 100 variabel dalam R

22

Apakah ada cara mudah dalam R untuk membuat regresi linier atas model dengan 100 parameter dalam R? Katakanlah kita memiliki vektor Y dengan 10 nilai dan kerangka data X dengan 10 kolom dan 100 baris Dalam notasi matematika saya akan menulis Y = X[[1]] + X[[2]] + ... + X[[100]]. Bagaimana saya menulis sesuatu yang serupa dalam sintaks R?

Kristen
sumber
1
apakah ada 100 atau 1000? Juga, Anda biasanya memiliki kolom menjadi variabel dan baris menjadi pengamatan (tampaknya dibalik di sini)
Makro
100 tambahan 0 adalah salah ketik
Christian
2
Sangat? Anda yakin ingin melakukan ini? Saya akan khawatir tentang overfitting dan korelasi antara kombinasi linear dari prediktor. Tidak hanya itu, dengan 100 prediktor tetapi hanya 10 pengamatan, Anda memiliki dan regresi linier tidak akan bekerja sama sekali. hal>n
Aaron - Pasang kembali Monica

Jawaban:

29

Coba ini

df<-data.frame(y=rnorm(10),x1=rnorm(10),x2=rnorm(10))
lm(y~.,df)
danas.zuokas
sumber
4
Dan jika Anda ingin, katakanlah, semua interaksi tingkat kedua, Anda dapat menulis y ~ . + .^2. Dan seterusnya.
Lutz Prechelt
3
Dan jika Anda hanya menginginkan beberapa interaksi urutan kedua, sesuatu seperti y ~ . + .:x1akan memberi Anda interaksi dari setiap variabel (kecuali x1) dengan x1. Dan seterusnya; Anda mendapatkan idenya.
Lutz Prechelt
21

Jawaban bagus!

Saya akan menambahkan bahwa secara default, memanggil formulapada data.framemenciptakan formula aditif untuk mundur kolom pertama ke yang lain.

Jadi, dalam hal jawaban @ danas.zuokas, Anda bahkan dapat melakukannya

lm(df)

yang ditafsirkan dengan benar.

gui11aume
sumber
Tetap saja, jawaban ini tidak berfungsi jika Anda ingin berbaur dalam istilah interaksi. Milik Anda melakukannya (+1).
gui11aume
6
Saya terus kagum pada betapa kelebihan beban sebagian besar Roperator :)
Makro
19

YnXn×halhal=100

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

Jika ada kolom lain yang tidak ingin Anda sertakan sebagai prediktor, Anda harus menghapusnya Xsebelum menggunakan trik ini, atau menggunakan -dalam rumus model untuk mengecualikannya. Misalnya, jika Anda ingin mengecualikan prediktor ke-67 (yang memiliki nama yang sesuai x67), maka Anda dapat menulis

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

Juga, jika Anda ingin memasukkan interaksi, dll. Anda harus menambahkannya secara manual sebagai (misalnya)

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

atau pastikan mereka dimasukkan sebagai kolom dari X.

Makro
sumber
19

Anda juga dapat menggunakan kombinasi formuladan pastefungsi.

Data Setup : Mari Ini bayangkan kita memiliki data.frame yang berisi variabel prediktor x1untuk x100dan variabel dependen kami y, tapi itu ada juga variabel gangguan asdfasdf. Juga variabel prediktor disusun dalam urutan sedemikian rupa sehingga tidak semua bersebelahan dalam 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=""))

Bayangkan juga bahwa Anda memiliki string yang berisi nama-nama variabel prediktor. Dalam hal ini, ini dapat dengan mudah dibuat menggunakan pastefungsi, tetapi dalam situasi lain, grepatau beberapa pendekatan lain mungkin digunakan untuk mendapatkan string ini.

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

Terapkan pendekatan : Kami kemudian dapat membuat formula sebagai berikut:

Formula <- formula(paste("y ~ ", 
     paste(PredictorVariables, collapse=" + ")))
lm(Formula, Data)
  • yang collapsemenyisipkan argumen +antara variabel prediktor
  • formulamengubah string menjadi objek formula kelas yang cocok untuk lmfungsi tersebut.

Lebih umum, saya menggunakan fungsi berikut secara teratur ketika saya ingin menyediakan variabel prediktor sebagai vektor nama variabel.

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)

}

Misalnya,

regression("y", PredictorVariables, Data)
Jeromy Anglim
sumber
2
+1. Saya menggunakan teknik ini sepanjang waktu. Namun, kadang-kadang, memiliki formula yang disimpan dalam variabel menyebabkan masalah. Lihat stackoverflow.com/a/7668846/210673 untuk penggunaan do.callmengevaluasi rumus sebelum menelepon lm.
Aaron - Pasang kembali Monica