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?


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)

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.


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.


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)

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.