คำถามถามเกี่ยวกับ "การระบุความสัมพันธ์พื้นฐาน [เชิงเส้น]" ระหว่างตัวแปร
วิธีที่ง่ายและรวดเร็วในการตรวจสอบความสัมพันธ์คือการถดถอยตัวแปรอื่น ๆ (ใช้ค่าคงที่หรือแม้แต่) กับตัวแปรเหล่านั้นโดยใช้ซอฟต์แวร์ที่คุณชื่นชอบ: ขั้นตอนการถดถอยที่ดีใด ๆ จะตรวจจับและวินิจฉัย collinearity (คุณจะไม่ต้องกังวลกับผลการถดถอย: เราพึ่งผลข้างเคียงที่เป็นประโยชน์ของการตั้งค่าและวิเคราะห์เมทริกซ์การถดถอย)
แม้ว่าการตรวจจับ collinearity จะเกิดอะไรขึ้นต่อไป การวิเคราะห์ส่วนประกอบหลัก (PCA) เป็นสิ่งที่ต้องการ: ส่วนประกอบที่เล็กที่สุดของมันสอดคล้องกับความสัมพันธ์ใกล้เชิงเส้น ความสัมพันธ์เหล่านี้สามารถอ่านได้โดยตรงจาก "การโหลด" ซึ่งเป็นการรวมกันเชิงเส้นของตัวแปรดั้งเดิม การโหลดขนาดเล็ก (นั่นคือสิ่งที่เกี่ยวข้องกับค่าลักษณะเฉพาะขนาดเล็ก) สอดคล้องกับค่าใกล้เคียงเชิงกล ค่าลักษณะเฉพาะจะสอดคล้องกับความสัมพันธ์เชิงเส้นที่สมบูรณ์แบบ ค่าลักษณะเฉพาะที่มีขนาดใหญ่กว่าเล็กน้อยซึ่งยังคงมีขนาดเล็กกว่าขนาดใหญ่ที่สุดจะสอดคล้องกับความสัมพันธ์เชิงเส้นโดยประมาณ0
(มีงานศิลปะและวรรณกรรมจำนวนมากที่เกี่ยวข้องกับการระบุว่าการโหลด "เล็ก" คืออะไรสำหรับการสร้างแบบจำลองตัวแปรตามฉันขอแนะนำให้รวมไว้ในตัวแปรอิสระใน PCA เพื่อระบุองค์ประกอบ - โดยไม่คำนึงถึง ขนาดของพวกเขา - ซึ่งตัวแปรตามมีบทบาทสำคัญจากมุมมองนี้ "เล็ก" หมายถึงเล็กกว่าองค์ประกอบดังกล่าวมาก)
ลองดูตัวอย่าง (ใช้R
สำหรับการคำนวณและการพล็อต) เริ่มต้นด้วยฟังก์ชั่นเพื่อทำการ PCA ค้นหาส่วนประกอบขนาดเล็กพล็อตพวกมันและส่งคืนความสัมพันธ์เชิงเส้นในหมู่พวกเขา
pca <- function(x, threshold, ...) {
fit <- princomp(x)
#
# Compute the relations among "small" components.
#
if(missing(threshold)) threshold <- max(fit$sdev) / ncol(x)
i <- which(fit$sdev < threshold)
relations <- fit$loadings[, i, drop=FALSE]
relations <- round(t(t(relations) / apply(relations, 2, max)), digits=2)
#
# Plot the loadings, highlighting those for the small components.
#
matplot(x, pch=1, cex=.8, col="Gray", xlab="Observation", ylab="Value", ...)
suppressWarnings(matplot(x %*% relations, pch=19, col="#e0404080", add=TRUE))
return(t(relations))
}
ลองใช้สิ่งนี้กับข้อมูลแบบสุ่ม เหล่านี้จะถูกสร้างขึ้นบนสี่ตัวแปร (คนและEของคำถาม) นี่คือฟังก์ชั่นเล็ก ๆ น้อย ๆ ในการคำนวณAเป็นการรวมกันเชิงเส้นของชุดอื่น ๆ จากนั้นจะเพิ่ม iid ค่าที่กระจายตามปกติให้กับตัวแปรทั้งห้า (เพื่อดูว่าโพรซีเดอร์ทำงานได้ดีเพียงใดเมื่อความสัมพันธ์หลายระดับเป็นค่าประมาณเท่านั้นและไม่แน่นอน)B,C,D,EA
process <- function(z, beta, sd, ...) {
x <- z %*% beta; colnames(x) <- "A"
pca(cbind(x, z + rnorm(length(x), sd=sd)), ...)
}
B,…,EA=B+C+D+EA=B+(C+D)/2+Esweep
n.obs <- 80 # Number of cases
n.vars <- 4 # Number of independent variables
set.seed(17)
z <- matrix(rnorm(n.obs*(n.vars)), ncol=n.vars)
z.mean <- apply(z, 2, mean)
z <- sweep(z, 2, z.mean)
colnames(z) <- c("B","C","D","E") # Optional; modify to match `n.vars` in length
B,…,EA
ผลลัพธ์ที่เกี่ยวข้องกับแผงด้านซ้ายบนคือ
A B C D E
Comp.5 1 -1 -1 -1 -1
00≈A−B−C−D−E
ผลลัพธ์สำหรับแผงตรงกลางด้านบนคือ
A B C D E
Comp.5 1 -0.95 -1.03 -0.98 -1.02
(A,B,C,D,E)
A B C D E
Comp.5 1 -1.33 -0.77 -0.74 -1.07
A′=B′+C′+D′+E′
1,1/2,1/2,1
ในทางปฏิบัติมันมักจะไม่ใช่กรณีที่ตัวแปรหนึ่งถูกแยกออกมาเป็นชุดที่ชัดเจนของคนอื่น ๆ : สัมประสิทธิ์ทั้งหมดอาจมีขนาดที่เทียบเท่าและสัญญาณที่แตกต่างกัน ยิ่งไปกว่านั้นเมื่อมีมากกว่าหนึ่งมิติของความสัมพันธ์ไม่มีวิธีที่ไม่ซ้ำในการระบุ: การวิเคราะห์เพิ่มเติม (เช่นการลดแถว) จำเป็นต้องระบุพื้นฐานที่เป็นประโยชน์สำหรับความสัมพันธ์เหล่านั้น นั่นเป็นวิธีที่โลกทำงาน: ทั้งหมดที่คุณสามารถพูดได้คือชุดค่าผสมพิเศษเหล่านี้ที่เอาต์พุตโดย PCA สอดคล้องกับแทบไม่มีการเปลี่ยนแปลงในข้อมูล เพื่อรับมือกับสิ่งนี้บางคนใช้ส่วนประกอบที่ใหญ่ที่สุด ("เงินต้น") โดยตรงเป็นตัวแปรอิสระในการถดถอยหรือการวิเคราะห์ที่ตามมาไม่ว่าจะใช้รูปแบบใด หากคุณทำสิ่งนี้อย่าลืมก่อนที่จะลบตัวแปรตามออกจากชุดของตัวแปรและทำซ้ำ PCA!
นี่คือรหัสในการทำซ้ำตัวเลขนี้:
par(mfrow=c(2,3))
beta <- c(1,1,1,1) # Also can be a matrix with `n.obs` rows: try it!
process(z, beta, sd=0, main="A=B+C+D+E; No error")
process(z, beta, sd=1/10, main="A=B+C+D+E; Small error")
process(z, beta, sd=1/3, threshold=2/3, main="A=B+C+D+E; Large error")
beta <- c(1,1/2,1/2,1)
process(z, beta, sd=0, main="A=B+(C+D)/2+E; No error")
process(z, beta, sd=1/10, main="A=B+(C+D)/2+E; Small error")
process(z, beta, sd=1/3, threshold=2/3, main="A=B+(C+D)/2+E; Large error")
(ฉันต้องเล่นซอกับขีด จำกัด ในกรณีข้อผิดพลาดขนาดใหญ่เพื่อแสดงเพียงองค์ประกอบเดียว: นั่นคือเหตุผลสำหรับการจัดหาค่านี้เป็นพารามิเตอร์ให้process
)
ผู้ใช้ ttnphns ได้โปรดให้ความสนใจกับหัวข้อที่เกี่ยวข้องอย่างใกล้ชิด หนึ่งในคำตอบ (โดย JM)แนะนำวิธีการที่อธิบายไว้ที่นี่