ทำไมฟังก์ชั่น R 'princomp' และ 'prcomp' ให้ค่าลักษณะที่แตกต่างกัน


22

คุณสามารถใช้ชุดข้อมูล Decathlon {FactoMineR} ในการทำซ้ำนี้ คำถามคือเหตุผลที่ค่าลักษณะเฉพาะที่คำนวณแตกต่างจากเมทริกซ์ความแปรปรวนร่วม

นี่คือค่าลักษณะเฉพาะที่ใช้princomp:

> library(FactoMineR);data(decathlon)
> pr <- princomp(decathlon[1:10], cor=F)
> pr$sd^2
      Comp.1       Comp.2       Comp.3       Comp.4       Comp.5       Comp.6 
1.348073e+02 2.293556e+01 9.747263e+00 1.117215e+00 3.477705e-01 1.326819e-01 
      Comp.7       Comp.8       Comp.9      Comp.10 
6.208630e-02 4.938498e-02 2.504308e-02 4.908785e-03 

และเช่นเดียวกันโดยใช้PCA:

> res<-PCA(decathlon[1:10], scale.unit=FALSE, ncp=5, graph = FALSE)
> res$eig
          eigenvalue percentage of variance cumulative percentage of variance
comp 1  1.348073e+02           79.659589641                          79.65959
comp 2  2.293556e+01           13.552956464                          93.21255
comp 3  9.747263e+00            5.759799777                          98.97235
comp 4  1.117215e+00            0.660178830                          99.63252
comp 5  3.477705e-01            0.205502637                          99.83803
comp 6  1.326819e-01            0.078403653                          99.91643
comp 7  6.208630e-02            0.036687700                          99.95312
comp 8  4.938498e-02            0.029182305                          99.98230
comp 9  2.504308e-02            0.014798320                          99.99710
comp 10 4.908785e-03            0.002900673                         100.00000

คุณช่วยอธิบายให้ฉันฟังได้หรือไม่ว่าทำไมค่าลักษณะเฉพาะที่คำนวณโดยตรงแตกต่างจากค่าเหล่านั้น (eigenvectors เหมือนกัน):

> eigen(cov(decathlon[1:10]))$values
 [1] 1.381775e+02 2.350895e+01 9.990945e+00 1.145146e+00 3.564647e-01
 [6] 1.359989e-01 6.363846e-02 5.061961e-02 2.566916e-02 5.031505e-03

นอกจากนี้prcompวิธีการทางเลือกให้ค่าลักษณะเฉพาะเช่นเดียวกับการคำนวณโดยตรง:

> prc <- prcomp(decathlon[1:10])
> prc$sd^2
 [1] 1.381775e+02 2.350895e+01 9.990945e+00 1.145146e+00 3.564647e-01
 [6] 1.359989e-01 6.363846e-02 5.061961e-02 2.566916e-02 5.031505e-03

ทำไมPCA/ princompและprcompให้ค่าลักษณะเฉพาะแตกต่างกันอย่างไร


PCA จะให้ผลลัพธ์ที่แตกต่างขึ้นอยู่กับว่าคุณใช้เมทริกซ์ความแปรปรวนร่วมหรือเมทริกซ์สหสัมพันธ์
charles.y.zheng

7
ความแตกต่างนั้นดูค่อนข้างเล็ก แต่อาจใหญ่เกินไปที่จะเป็นปัญหาเชิงตัวเลขอย่างง่าย มันเป็นความแตกต่างระหว่าง normalizing โดยหรือn - 1ตัวอย่างเช่นเมื่อคำนวณการประมาณความแปรปรวนร่วมก่อนคำนวณ SVD หรือการสลายตัวของค่าลักษณะเฉพาะ? nn-1
พระคาร์ดินัล

7
@cardinal ลองเดาดูสิ! ขอให้สังเกตว่าทั้งสองลำดับของค่าลักษณะเฉพาะมีอัตราส่วนต่อเนื่องที่เหมือนกัน ดังนั้นชุดหนึ่งจึงเป็นค่าคงที่หลายชุด หลายค่าคือ 1.025 = 41/40 ( ตรง ) มันไม่ชัดเจนสำหรับฉันว่าสิ่งนี้มาจากไหน ชุดข้อมูลอาจมี 41 องค์ประกอบและ OP เปิดเผยเพียง 10 รายการแรกใช่หรือไม่
whuber

7
@cardinal แท้จริง: หน้าช่วยเหลือสำหรับprincomp: "โปรดทราบว่าการคำนวณเริ่มต้นใช้ตัวหาร N สำหรับเมทริกซ์ความแปรปรวนร่วม" หน้าช่วยเหลือสำหรับprcomp: "ไม่เหมือนกับ princomp ความแปรปรวนจะถูกคำนวณด้วยตัวหารปกติ N-1"
caracal

2
@ caracal คุณควรคัดลอกความคิดเห็นของคุณเป็นคำตอบ (และอาจทำให้เป็น CW) เพื่อให้สามารถยอมรับได้และคำถามนั้นสามารถทำเครื่องหมายว่าแก้ไขแล้ว
พระคาร์ดินัล

คำตอบ:


16

princompยังไม่มีข้อความprcompcovยังไม่มีข้อความ-1ยังไม่มีข้อความ

สิ่งนี้ถูกกล่าวถึงในส่วนรายละเอียดของhelp(princomp):

โปรดทราบว่าการคำนวณเริ่มต้นใช้ตัวหาร 'N' สำหรับเมทริกซ์ความแปรปรวนร่วม

และส่วนรายละเอียดของhelp(prcomp):

ต่างจากการprincompคำนวณผลต่างกับตัวหารปกติ N - 1

princompยังไม่มีข้อความn.obscv

else if (is.null(covmat)) {
    dn <- dim(z)
    if (dn[1L] < dn[2L]) 
        stop("'princomp' can only be used with more units than variables")
    covmat <- cov.wt(z)
    n.obs <- covmat$n.obs
    cv <- covmat$cov * (1 - 1/n.obs)
    cen <- covmat$center
}

คุณสามารถหลีกเลี่ยงการคูณนี้ได้โดยระบุcovmatอาร์กิวเมนต์แทนxอาร์กิวเมนต์

princomp(covmat = cov(iris[,1:4]))$sd^2

อัปเดตเกี่ยวกับคะแนน PCA:

cor = TRUEprincompprincompZยังไม่มีข้อความ

princomp(scale(data))$scoresprincomp(data, cor = TRUE)$scores(ยังไม่มีข้อความ-1)/ยังไม่มีข้อความ


1
คุณอาจลองแทนที่ "เดา" ด้วย "ยืนยันแล้ว" (ดูสตรีมความคิดเห็นด้านบน) คุณอาจลองแก้ไขคำตอบเพื่อให้ CW ไชโย
พระคาร์ดินัล

@cardinal ฉันไม่เห็นความคิดเห็นเหล่านั้น ฉันเห็นเฉพาะผู้ที่ได้รับการโหวตเท่านั้น ขอบคุณ นอกจากนี้คุณสามารถอธิบายเหตุผลเบื้องหลังการตอบ CW ได้หรือไม่? อะไรคือกฎ / แนวทางสำหรับสิ่งนั้น
Joshua Ulrich

ใครสามารถเดาได้ว่าทำไมรหัสไม่เพียงแค่cv <- cov.wt(z, method="ML")ทำให้ทั้งสองสาย follwing ไม่จำเป็น?
caracal

2
@ โจชัว: ข้อเสนอแนะของฉันเกี่ยวกับการทำคำตอบ CW เป็นเพราะความจริงที่ว่าคำตอบที่ปรากฏผ่านกระแสของความคิดเห็นและถูกสร้างขึ้นโดยการอภิปราย "ชุมชน" เนื่องจากมันได้รับการแก้ไขในความคิดเห็นของฉันความคิดของฉันก็คือมันเป็นเรื่องที่เหมาะสมที่สุดที่จะปรับมันเป็นคำตอบทำเครื่องหมายเป็น CW เพื่อบ่งบอกถึงการทำงานร่วมกันนี้และสิ่งนี้ทำให้สามารถตอบรับคำ (ไม่เช่นนั้นซอฟต์แวร์จะทำการสำรองข้อมูลโดยอัตโนมัติหลังจากเวลาผ่านไประยะหนึ่ง)
cardinal

1
@amoeba มันจะมีประโยชน์ที่จะพูดถึงว่าในการแก้ไขความคิดเห็นของคุณ "เพิ่ม 860 ตัวอักษรไปยังเนื้อหา" ในคำตอบของตัวอักษร ~ 450 ไม่ได้ช่วยให้ใครประเมินว่าการแก้ไขนั้นสมเหตุสมผลหรือไม่
Joshua Ulrich
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.