วิธีการเขียนสูตรโมเดลเชิงเส้นด้วย 100 ตัวแปรใน R


22

มีวิธีง่าย ๆ ใน R ในการสร้างการถดถอยเชิงเส้นเหนือโมเดลที่มี 100 พารามิเตอร์ใน R หรือไม่? สมมติว่าเรามีเวกเตอร์ Y 10 ค่าและ dataframe X กับ 10 คอลัมน์และ 100 Y = X[[1]] + X[[2]] + ... + X[[100]]แถวในสัญกรณ์คณิตศาสตร์ผมจะเขียน ฉันจะเขียนสิ่งที่คล้ายกันในไวยากรณ์ R ได้อย่างไร


1
มี 100 หรือ 1,000 นอกจากนี้โดยปกติแล้วคุณจะต้องมีคอลัมน์เป็นตัวแปรและแถวต่างๆเป็นข้อสังเกต (ปรากฏว่ามีการย้อนกลับที่นี่)
แมโคร

100 ส่วนเสริม 0 เป็นตัวพิมพ์ผิด
Christian

2
จริงๆ? คุณแน่ใจหรือว่าต้องการทำสิ่งนี้ ฉันจะกังวลเกี่ยวกับการมีส่วนร่วมมากเกินไปและความสัมพันธ์ระหว่างชุดค่าผสมเชิงเส้นของตัวทำนาย ไม่เพียงเท่านั้นที่มีผู้ทำนาย 100 คน แต่มีเพียง 10 ข้อเท่านั้นคุณมีและการถดถอยเชิงเส้นจะไม่ทำงานเลย p>n
แอรอน - คืนสถานะโมนิก้า

คำตอบ:


29

ลองสิ่งนี้

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

4
และถ้าคุณต้องการพูดการโต้ตอบลำดับที่สองทั้งหมดคุณสามารถเขียนy ~ . + .^2ได้ และอื่น ๆ
Lutz Prechelt

3
และถ้าคุณต้องการเพียงบางส่วนของปฏิสัมพันธ์ลำดับที่สองบางอย่างเช่นy ~ . + .:x1คุณจะได้รับการโต้ตอบของแต่ละตัวแปร (ยกเว้นx1) x1ด้วย และอื่น ๆ ; คุณได้รับความคิด
Lutz Prechelt

21

คำตอบที่ดี!

ฉันจะเพิ่มที่โดยค่าเริ่มต้นการเรียกformulaใช้data.frameสร้างสูตรเสริมเพื่อถอยหลังคอลัมน์แรกไปยังคนอื่น ๆ

ดังนั้นในกรณีของคำตอบของ @ danas.zuokas คุณสามารถทำได้

lm(df)

ซึ่งตีความอย่างถูกต้อง


ถึงกระนั้นคำตอบนี้ไม่สามารถใช้งานได้หากคุณต้องการผสมผสานในแง่ของการโต้ตอบ ขอแสดงความนับถือ (+1)
gui11aume

6
ฉันประหลาดใจอย่างต่อเนื่องว่าRผู้ให้บริการส่วนใหญ่ล้นมือเป็นอย่างไร :)
30412 Macro

19

YnXn×pp=100

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

หากมีคอลัมน์อื่น ๆ ที่คุณไม่ต้องการรวมไว้เป็นตัวทำนายคุณจะต้องลบออกXก่อนที่จะใช้เคล็ดลับนี้หรือใช้-ในสูตรแบบจำลองเพื่อแยกออก ตัวอย่างเช่นหากคุณต้องการยกเว้นตัวทำนายลำดับที่ 67 (ที่มีชื่อที่สอดคล้องกันx67) คุณก็สามารถเขียนได้

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

นอกจากนี้หากคุณต้องการรวมการโต้ตอบ ฯลฯ คุณจะต้องเพิ่มการโต้ตอบด้วยตนเองเป็น (เช่น)

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

Xหรือให้แน่ใจว่าพวกเขาจะป้อนเป็นคอลัมน์ของ


19

คุณยังสามารถใช้การรวมกันของformulaและpasteฟังก์ชั่น

ข้อมูลการติดตั้ง : ลองจินตนาการว่าเรามี data.frame ที่มีตัวแปรที่x1ไปx100และตัวแปรตามของเราแต่ยังมีตัวแปรรำคาญy asdfasdfนอกจากนี้ตัวแปรการทำนายจะถูกจัดเรียงตามลำดับซึ่งไม่ได้อยู่ติดกันทั้งหมดใน 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=""))

ลองจินตนาการดูว่าคุณมีสตริงที่มีชื่อของตัวแปรตัวทำนาย ในกรณีนี้สิ่งนี้สามารถสร้างได้อย่างง่ายดายโดยใช้pasteฟังก์ชั่น แต่ในสถานการณ์อื่น ๆgrepหรืออาจใช้วิธีการอื่นเพื่อรับสายนี้

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

ใช้วิธีการ : จากนั้นเราสามารถสร้างสูตรได้ดังนี้:

Formula <- formula(paste("y ~ ", 
     paste(PredictorVariables, collapse=" + ")))
lm(Formula, Data)
  • collapseแทรกโต้แย้ง+ระหว่างตัวแปร
  • formulaแปลงสตริงเป็นวัตถุของสูตรคลาสที่เหมาะสมกับlmฟังก์ชัน

โดยทั่วไปแล้วฉันใช้ฟังก์ชั่นต่อไปนี้เป็นประจำเมื่อฉันต้องการให้ตัวแปรทำนายผลเป็นเวกเตอร์ของชื่อตัวแปร

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)

}

เช่น,

regression("y", PredictorVariables, Data)

2
+1 ฉันใช้เทคนิคนี้ตลอดเวลา อย่างไรก็ตามในบางครั้งการมีสูตรเก็บไว้ในตัวแปรทำให้เกิดปัญหา ดูstackoverflow.com/a/7668846/210673สำหรับการใช้ประเมินสูตรก่อนที่จะเรียกdo.call lm
แอรอน - คืนสถานะโมนิก้า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.