วิธีการคำนวณ variance inflation factor (vif) ในหน่วย r
ความหลากหลาย ในการวิเคราะห์การถดถอยเกิดขึ้นเมื่อตัวแปรทำนายตั้งแต่สองตัวขึ้นไปมีความสัมพันธ์กันอย่างมาก โดยไม่ได้ให้ข้อมูลที่ไม่ซ้ำกันหรือเป็นอิสระในแบบจำลองการถดถอย
หากระดับความสัมพันธ์ระหว่างตัวแปรสูงเพียงพอ อาจทำให้เกิดปัญหาเมื่อปรับให้เหมาะสมและ ตีความแบบจำลองการถดถอย
วิธีที่ใช้กันทั่วไปในการตรวจจับหลายคอลลิเนียร์คือการใช้ปัจจัยอัตราเงินเฟ้อแปรปรวน (VIF) ซึ่งวัด ความสัมพันธ์ และความแข็งแกร่งของความสัมพันธ์ระหว่างตัวแปรทำนายในแบบจำลองการถดถอย
ค่า VIF เริ่มต้นที่ 1 และไม่มีขีดจำกัดบน กฎทั่วไปสำหรับการตีความ VIF คือ:
- ค่า 1 บ่งชี้ว่าไม่มีความสัมพันธ์ระหว่างตัวแปรทำนายที่กำหนดกับตัวแปรทำนายอื่นๆ ในแบบจำลอง
- ค่าระหว่าง 1 ถึง 5 บ่งชี้ถึงความสัมพันธ์ระดับปานกลางระหว่างตัวแปรทำนายที่กำหนดกับตัวแปรทำนายอื่นๆ ในแบบจำลอง แต่มักจะไม่รุนแรงพอที่จะต้องได้รับการดูแลเป็นพิเศษ
- ค่าที่มากกว่า 5 บ่งชี้ถึงความสัมพันธ์ที่อาจร้ายแรงระหว่างตัวแปรทำนายที่กำหนดกับตัวแปรทำนายอื่นๆ ในแบบจำลอง ในกรณีนี้การประมาณค่าสัมประสิทธิ์และค่า p ในผลลัพธ์การถดถอยมีแนวโน้มว่าจะไม่น่าเชื่อถือ
โปรดทราบว่ามีบางกรณีที่ค่า VIF สูง สามารถละเว้นได้อย่างปลอดภัย
วิธีการคำนวณ VIF ใน R
เพื่อแสดงวิธีคำนวณ VIF สำหรับแบบจำลองการถดถอยใน R เราจะใช้ชุดข้อมูล mtcars ในตัว:
#view first six lines of mtcars
head(mtcars)
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
#Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
#Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
ขั้นแรก เราจะปรับโมเดลการถดถอยโดยใช้ mpg เป็นตัวแปรตอบสนอง และ disp , hp , wt และ drat เป็นตัวแปรทำนาย:
#fit the regression model model <- lm(mpg ~ disp + hp + wt + drat, data = mtcars) #view the output of the regression model summary(model) #Call: #lm(formula = mpg ~ disp + hp + wt + drat, data = mtcars) # #Residuals: # Min 1Q Median 3Q Max #-3.5077 -1.9052 -0.5057 0.9821 5.6883 # #Coefficients: #Estimate Std. Error t value Pr(>|t|) #(Intercept) 29.148738 6.293588 4.631 8.2e-05 *** #available 0.003815 0.010805 0.353 0.72675 #hp -0.034784 0.011597 -2.999 0.00576 ** #wt -3.479668 1.078371 -3.227 0.00327 ** #drat 1.768049 1.319779 1.340 0.19153 #--- #Significant. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 # #Residual standard error: 2.602 on 27 degrees of freedom #Multiple R-squared: 0.8376, Adjusted R-squared: 0.8136 #F-statistic: 34.82 on 4 and 27 DF, p-value: 2.704e-10
จากผลลัพธ์เราจะเห็นได้ว่า ค่า R กำลังสอง ของแบบจำลองคือ 0.8376 นอกจากนี้เรายังสามารถเห็นได้ว่า สถิติ F โดยรวม คือ 34.82 และค่า p ที่สอดคล้องกันคือ 2.704e-10 ซึ่งบ่งชี้ว่าแบบจำลองการถดถอยโดยรวมมีความสำคัญ นอกจากนี้ ตัวแปรทำนาย hp และ wt มีนัยสำคัญทางสถิติที่ระดับนัยสำคัญ 0.05 ในขณะที่ disp และ drat ไม่มีนัยสำคัญ
ต่อไป เราจะใช้ฟังก์ชัน vive() ของไลบรารี เพื่อ คำนวณ VIF สำหรับตัวแปรทำนายแต่ละตัวในโมเดล:
#load the car library library(car) #calculate the VIF for each predictor variable in the model lively(model) # disp hp wt drat #8.209402 2.894373 5.096601 2.279547
เราจะเห็นว่า VIF สำหรับ disp และ wt มากกว่า 5 ซึ่งอาจน่ากังวล
การดูค่า VIF
ในการแสดงภาพค่า VIF สำหรับตัวแปรทำนายแต่ละตัว เราสามารถสร้างแผนภูมิแท่งแนวนอนง่ายๆ และเพิ่มเส้นแนวตั้งที่ 5 เพื่อให้เรามองเห็นได้ชัดเจนว่าค่า VIF ใดเกิน 5:
#create vector of VIF values vive_values <- vive(model) #create horizontal bar chart to display each VIF value barplot(vif_values, main = "VIF Values", horiz = TRUE, col = "steelblue") #add vertical line at 5 abline(v = 5, lwd = 3, lty = 2)
โปรดทราบว่าแผนภูมิประเภทนี้จะมีประโยชน์มากที่สุดสำหรับโมเดลที่มีตัวแปรทำนายจำนวนมาก ดังนั้นเราจึงสามารถดูค่า VIF ทั้งหมดพร้อมกันได้อย่างง่ายดาย อย่างไรก็ตาม นี่เป็นแผนภูมิที่มีประโยชน์ในตัวอย่างนี้
ขึ้นอยู่กับค่า VIF ที่คุณพิจารณาว่าสูงเกินกว่าจะรวมไว้ในโมเดล คุณสามารถเลือกลบตัวแปรทำนายบางตัวออก และดูว่า ค่า R-squared ที่สอดคล้องกันหรือ ข้อผิดพลาดมาตรฐาน ของโมเดลได้รับผลกระทบหรือไม่
การแสดงภาพความสัมพันธ์ระหว่างตัวแปรทำนาย
เพื่อให้เข้าใจได้ดีขึ้นว่าเหตุใดตัวแปรทำนายอาจมีค่า VIF สูง เราสามารถสร้างเมทริกซ์สหสัมพันธ์เพื่อแสดงค่าสัมประสิทธิ์สหสัมพันธ์เชิงเส้นระหว่างตัวแปรแต่ละคู่ได้:
#define the variables we want to include in the correlation matrix data <- mtcars[, c("disp", "hp", "wt", "drat")] #create correlation matrix cor(data) # disp hp wt drat #available 1.0000000 0.7909486 0.8879799 -0.7102139 #hp 0.7909486 1.0000000 0.6587479 -0.4487591 #wt 0.8879799 0.6587479 1.0000000 -0.7124406 #drat -0.7102139 -0.4487591 -0.7124406 1.0000000
โปรดจำไว้ว่าตัวแปร disp มีค่า VIF มากกว่า 8 ซึ่งเป็นค่า VIF ที่สูงที่สุดในบรรดาตัวแปรทำนายทั้งหมดในแบบจำลอง จากเมทริกซ์สหสัมพันธ์ เราจะเห็นว่า disp มีความสัมพันธ์อย่างมากกับตัวแปรทำนายอีกสามตัว ซึ่งอธิบายว่าทำไมค่า VIF ของมันจึงสูงมาก
ในกรณีนี้ คุณอาจต้องการลบ disp ออกจากโมเดลเนื่องจากค่า VIF ของโมเดลนั้นสูง และ ไม่มีนัยสำคัญทางสถิติที่ระดับนัยสำคัญ 0.05
โปรดทราบว่าเมทริกซ์สหสัมพันธ์และ VIF จะให้ข้อมูลที่คล้ายกันแก่คุณ โดยทั้งสองจะบอกคุณเมื่อตัวแปรมีความสัมพันธ์อย่างมากกับตัวแปรอื่นตั้งแต่หนึ่งตัวขึ้นไปในแบบจำลองการถดถอย
อ่านเพิ่มเติม:
คู่มือเกี่ยวกับพหุคอลลิเนียร์ริตีและ VIF ในการถดถอย
ค่า R-กำลังสองที่ดีคืออะไร?