วิธีการสร้างเมทริกซ์ความแปรปรวนร่วมโดยพลการ


21

ยกตัวอย่างเช่นในRการMASS::mvrnorm()ฟังก์ชั่นจะเป็นประโยชน์สำหรับการสร้างข้อมูลที่แสดงให้เห็นถึงสิ่งต่างๆในสถิติ มันต้องใช้Sigmaอาร์กิวเมนต์ที่จำเป็นซึ่งเป็นเมทริกซ์สมมาตรซึ่งระบุเมทริกซ์ความแปรปรวนร่วมของตัวแปร ฉันจะสร้างเมทริกซ์สมมาตรด้วยรายการตามอำเภอใจได้อย่างไรn×n


3
ฉันคิดว่าคำถามนี้จะได้รับประโยชน์จากการแก้ไขเพื่อมุ่งเน้นไปที่ "ฉันจะสร้างเมทริกซ์ความแปรปรวนร่วมโดยพลการ" ได้อย่างไรและน้อยกว่าในด้านการเข้ารหัส แน่นอนว่ามีประเด็นทางสถิติที่เกี่ยวข้องกับหัวข้อที่นี่ซึ่งแสดงให้เห็นโดยคำตอบ
Silverfish

คำตอบ:


22

สร้างn×n เมทริกซ์ที่มีค่าโดยพลการA

จากนั้นใช้Σ=ATAเป็นเมทริกซ์ความแปรปรวนร่วมของคุณ

ตัวอย่างเช่น

n <- 4  
A <- matrix(runif(n^2)*2-1, ncol=n) 
Sigma <- t(A) %*% A

Sigma <- A + t(A)ในทำนองเดียวกัน
rsl

6
@MoazzemHossen: ข้อเสนอแนะของคุณจะสร้างเมทริกซ์สมมาตร แต่อาจไม่เป็น semidefinite เชิงบวกเสมอ (เช่นข้อเสนอแนะของคุณสามารถสร้างเมทริกซ์ที่มีค่าลักษณะลบที่เป็นลบ) และดังนั้นจึงอาจไม่เหมาะกับเมทริกซ์ความแปรปรวนร่วม
Henry

ใช่ฉันสังเกตเห็นว่า R ส่งคืนข้อผิดพลาดในกรณีที่วิธีที่แนะนำของฉันสร้างเมทริกซ์ที่ไม่เหมาะสม
rsl

4
โปรดทราบว่าหากคุณต้องการเมทริกซ์สหสัมพันธ์เพื่อการตีความที่ดีขึ้นจะมีฟังก์ชัน? cov2corซึ่งสามารถนำมาใช้ในภายหลังได้
gung - Reinstate Monica

1
@ B11b: คุณต้องการเมทริกซ์ความแปรปรวนร่วมของคุณเป็นแบบกึ่งบวกแน่นอน นั่นจะทำให้ข้อ จำกัด เกี่ยวกับค่าความแปรปรวนร่วมไม่ชัดเจนโดยสิ้นเชิงเมื่อn>2
Henry

24

ฉันชอบที่จะควบคุมวัตถุที่ฉันสร้างแม้ว่าพวกเขาอาจจะไม่ได้ตั้งใจก็ตาม

พิจารณาแล้วว่าเป็นไปได้ทั้งหมดแปรปรวนเมทริกซ์Σสามารถแสดงในรูปแบบn×nΣ

Σ=P Diagonal(σ1,σ2,,σn) P

ที่เป็นมุมฉากเมทริกซ์และσ 1σ 2σ n 0Pσ1σ2σn0

เรขาคณิตนี้อธิบายถึงโครงสร้างความแปรปรวนที่มีช่วงขององค์ประกอบหลักที่มีขนาดฉัน ส่วนประกอบเหล่านี้ชี้ไปในทิศทางของแถวของP ดูตัวเลขที่ทำให้ความรู้สึกของการวิเคราะห์องค์ประกอบหลัก, eigenvectors และค่าลักษณะเฉพาะตัวอย่างกับn = 3 การตั้งค่าσ iจะกำหนดขนาดของโควาเรียสและขนาดสัมพัทธ์ แถวของPปรับแกนของรูปร่างตามที่คุณต้องการσiPn=3σiP

ประโยชน์เชิงพีชคณิตและการคำนวณอย่างหนึ่งของวิธีการนี้คือเมื่อ , Σกลับด้านได้อย่างง่ายดาย (ซึ่งเป็นการดำเนินการทั่วไปในเมทริกซ์ความแปรปรวนร่วม):σn>0Σ

Σ1=P Diagonal(1/σ1,1/σ2,,1/σn) P.

ไม่สนใจเกี่ยวกับทิศทาง แต่เพียงช่วงของขนาดที่ ? ไม่เป็นไร: คุณสามารถสร้างเมทริกซ์แบบ orthogonal แบบสุ่มได้อย่างง่ายดาย เพียงแค่ห่อn 2 iid มาตรฐานค่าปกติลงในเมทริกซ์จตุรัสแล้วปรับมุมมัน มันเกือบจะแน่นอนจะทำงาน (ให้nไม่ได้เป็นขนาดใหญ่) การย่อยสลาย QR จะทำเช่นนั้นในรหัสนี้σin2n

n <- 5
p <- qr.Q(qr(matrix(rnorm(n^2), n)))

สิ่งนี้ได้ผลเพราะการกระจายแบบพหุคูณ -variate ที่สร้างขึ้นจึงเป็น "รูปไข่": มันคงที่ภายใต้การหมุนและการสะท้อนทั้งหมด (ผ่านจุดกำเนิด) ดังนั้นเมทริกซ์ฉากมุมฉากทั้งหมดจะถูกสร้างขึ้นอย่างสม่ำเสมอตามที่ถกเถียงกันอยู่ว่าจะสร้างจุดกระจายอย่างสม่ำเสมอบนพื้นผิวของทรงกลม 3 มิติได้อย่างไร .n

วิธีที่รวดเร็วในการขอรับจากPและσ ฉันเมื่อคุณได้ระบุหรือสร้างพวกใช้และการหาประโยชน์'s กลับมาใช้ของอาร์เรย์ในการดำเนินการทางคณิตศาสตร์เช่นในตัวอย่างนี้กับσ = ( σ 1 , ... , σ 5 ) = ( 5 , 4 , 3 , 2 , 1 ) :ΣPσicrossprodRσ=(σ1,,σ5)=(5,4,3,2,1)

Sigma <- crossprod(p, p*(5:1))

ขณะที่การตรวจสอบ, การสลายตัวมูลค่าเอกพจน์ควรกลับทั้งและP ' คุณสามารถตรวจสอบได้ด้วยคำสั่งσP

svd(Sigma)

The inverse of Sigma of course is obtained merely by changing the multiplication by σ into a division:

Tau <- crossprod(p, p/(5:1))

You may verify this by viewing zapsmall(Sigma %*% Tau), which should be the n×n identity matrix. A generalized inverse (essential for regression calculations) is obtained by replacing any σi0 by 1/σi, exactly as above, but keeping any zeros among the σi as they were.


It might help to demonstrate how to use the rows of P to orient the axes as preferred.
gung - Reinstate Monica

1
Might be worth mentioning that the singular values in svd(Sigma) will be reordered -- that confused me for a minute.
FrankD

1

You can simulate random positive definite matrices from the Wishart distribution using the function "rWishart" from the widely used package "stats".

n <- 4
rWishart(1,n,diag(n))

1

There is a package specifically for that, clusterGeneration (written among other by Harry Joe, a big name in that field).

There are two main functions:

  • genPositiveDefMat generate a covariance matrix, 4 different methods
  • rcorrmatrix : generate a correlation matrix

Quick example:

library(clusterGeneration)
#> Loading required package: MASS
genPositiveDefMat("unifcorrmat",dim=3)
#> $egvalues
#> [1] 15.408962  5.673916  1.228842
#> 
#> $Sigma
#>          [,1]     [,2]     [,3]
#> [1,] 6.714871 1.643449 6.530493
#> [2,] 1.643449 6.568033 2.312455
#> [3,] 6.530493 2.312455 9.028815
genPositiveDefMat("eigen",dim=3)
#> $egvalues
#> [1] 8.409136 4.076442 2.256715
#> 
#> $Sigma
#>            [,1]       [,2]      [,3]
#> [1,]  2.3217300 -0.1467812 0.5220522
#> [2,] -0.1467812  4.1126757 0.5049819
#> [3,]  0.5220522  0.5049819 8.3078880

Created on 2019-10-27 by the reprex package (v0.3.0)

Finally, note that an alternative approach is to do a first try from scratch, then use Matrix::nearPD() to make your matrix positive-definite.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.