ฉันจะสร้างข้อมูลด้วยเมทริกซ์สหสัมพันธ์ที่ได้รับการกำหนดล่วงหน้าได้อย่างไร


19

ฉันพยายามที่จะสร้างสุ่มลำดับความสัมพันธ์กับค่าเฉลี่ย =แปรปรวน = , ค่าสัมประสิทธิ์สหสัมพันธ์ = 0.8ในรหัสด้านล่างนี้ฉันใช้& เป็นส่วนเบี่ยงเบนมาตรฐานและ& เป็นวิธีการ1 0.8010.8s1s2m1m2

p = 0.8 
u = randn(1, n)
v = randn(1, n)
x = s1 * u + m1
y = s2 * (p * u + sqrt(1 - p^2) * v) + m2

นี้ทำให้ผมที่ถูกต้องcorrcoef()0.8 ระหว่างและx yคำถามของฉันคือวิธีการที่ฉันสามารถสร้างชุดหมายความว่าถ้าผมต้องการzที่ยังมีความสัมพันธ์กับy(ที่มีความสัมพันธ์เดียวกัน ) แต่ไม่ได้อยู่กับ มีสูตรเฉพาะที่ฉันต้องรู้หรือไม่? ผมพบว่าหนึ่งแต่ไม่สามารถเข้าใจมันr=0.8x


คำตอบ:


21

ดูเหมือนว่าคุณกำลังถามวิธีสร้างข้อมูลด้วยเมทริกซ์ความสัมพันธ์เฉพาะ

ความเป็นจริงที่มีประโยชน์คือว่าถ้าคุณมีเวกเตอร์สุ่มกับความแปรปรวนเมทริกซ์Σแล้วสุ่มเวกเตอร์xมีค่าเฉลี่ยE ( x )และความแปรปรวนเมทริกซ์Ω = Σ T ดังนั้นหากคุณเริ่มต้นด้วยข้อมูลที่มีค่าเป็นศูนย์การคูณด้วยAจะไม่เปลี่ยนแปลงดังนั้นความต้องการแรกของคุณจึงเป็นที่พอใจได้ง่าย xΣAxAE(x)Ω=AΣATA

สมมติว่าคุณเริ่มต้นด้วย (หมายถึงศูนย์) ข้อมูล uncorrelated (เช่นเมทริกซ์ความแปรปรวนเป็นเส้นทแยงมุม) - นับตั้งแต่ที่เรากำลังพูดถึงสัมพันธ์เมทริกซ์ขอเพียงแค่ใช้เวลาฉัน คุณสามารถเปลี่ยนนี้ข้อมูลที่มีเมทริกซ์ความแปรปรวนที่ได้รับจากการเลือกจะเป็นรากที่ CholeskyของΩ - แล้วxจะมีที่ต้องการความแปรปรวนเมทริกซ์ΩΣ=ผมAΩAxΩ

ในตัวอย่างของคุณคุณต้องการให้สิ่งนี้:

Ω=(10.800.810.800.81)

น่าเสียดายที่เมทริกซ์นั้นไม่ได้เป็นค่าบวกแน่นอนดังนั้นมันจึงไม่ใช่เมทริกซ์ความแปรปรวนร่วม - คุณสามารถตรวจสอบสิ่งนี้ได้โดยดูว่าดีเทอร์มีแนนต์เป็นลบ บางทีอาจจะแทน

Ω=(10.80.30.810.80.30.81)    โอR   Ω=(12/302/312/302/31)

จะพอเพียง ฉันไม่แน่ใจวิธีคำนวณรากที่สองของ cholesky ใน matlab (ซึ่งดูเหมือนจะเป็นสิ่งที่คุณใช้) แต่Rคุณสามารถใช้chol()ฟังก์ชันนี้ได้

ในตัวอย่างนี้สำหรับสอง s ที่ระบุไว้ข้างต้นคูณเมทริกซ์ที่เหมาะสม (ตามลำดับ) จะเป็นΩ

A=(1000.80.600.30.9330.1972)    โอR   A=(1002/30.7453000.89440.4472)

Rรหัสใช้ที่จะมาถึงนี้คือ:

x = matrix(0,3,3)
x[1,]=c(1,.8,.3)
x[2,]=c(.8,1,.8)
x[3,]=c(.3,.8,1)
t(chol(x))

     [,1]      [,2]      [,3]
[1,]  1.0 0.0000000 0.0000000
[2,]  0.8 0.6000000 0.0000000
[3,]  0.3 0.9333333 0.1972027

x[1,]=c(1,2/3,0)
x[2,]=c(2/3,1,2/3)
x[3,]=c(0,2/3,1)
t(chol(x))

      [,1]      [,2]      [,3]
[1,] 1.0000000 0.0000000 0.0000000
[2,] 0.6666667 0.7453560 0.0000000
[3,] 0.0000000 0.8944272 0.4472136

1
ฟังก์ชั่น MATLABcholจะเรียกว่า โปรดทราบว่านี่อาจเป็นตัวเลขที่ไม่เสถียรหากเกือบเป็นเอกพจน์ ในกรณีดังกล่าวการใช้สแควร์รูทแบบสมมาตรที่ได้รับเช่นผ่าน SVD มักจะเป็นตัวเลือกที่ดีกว่าในแง่ของความเสถียรเชิงตัวเลข :)Ω
สำคัญ

1
แน่นอนว่าเป็นสิ่งที่ถูกต้อง @ cardinal - สิ่งต่าง ๆ ที่มีเหตุผลตามหลักเหตุผลจะไม่ดีเมื่อคุณพยายามทำตัวเลขด้วยเมทริกซ์เกือบเอกพจน์ ฉันจินตนาการถึงสถานการณ์ที่เมทริกซ์สหสัมพันธ์เป้าหมายไม่ได้อยู่ในขอบเขตที่เป็นปัญหา มันเป็นเรื่องดีที่คุณชี้ให้เห็นนี้ - ขอบคุณ (และขอขอบคุณสำหรับการแก้ไขคำตอบอื่น ๆ ของฉัน)
มาโคร

1
เหตุผลหลักที่ฉันคิดเกี่ยวกับเรื่องนี้เป็นเพราะสายตาที่กระตือรือร้นของคุณในการรับรู้ว่าคำแนะนำแรกของ OP ไม่ได้เป็นบวกแน่นอน และหวังว่าการแก้ไขคำถามอื่น ๆ จะไม่สุดเหวี่ยง ฉันชอบคำตอบทั้งสองนี้
พระคาร์ดินัล

7

หากคุณใช้ R คุณสามารถใช้ฟังก์ชัน mvrnorm จากแพ็คเกจ MASS โดยสมมติว่าคุณต้องการตัวแปรแบบกระจายตามปกติ การดำเนินการคล้ายกับคำอธิบายของมาโครด้านบน แต่ใช้ eigenvectors ของเมทริกซ์สหสัมพันธ์แทนการสลายตัวของ cholesky และปรับขนาดด้วยค่าการสลายตัวเอกพจน์ (ถ้าตัวเลือกเชิงประจักษ์ตั้งค่าเป็นจริง)

ถ้าเป็นเมทริกซ์ที่มีรายการมาจากการกระจายปกติΣเป็นเมทริกซ์ความสัมพันธ์เชิงบวกที่ชัดเจนกับ eigenvectors γและλเป็นเมทริกซ์ตารางที่มีรากที่ Eigen ค่าจากΣตามเส้นทแยงมุมแล้ว:XΣγλΣ

X=γλXT

ที่ X' เป็นเมทริกซ์กระจายตามปกติกับเมทริกซ์ความสัมพันธ์ของและวิธีคอลัมน์เป็นเช่นเดียวกับXΣX

โปรดทราบว่าเมทริกซ์สหสัมพันธ์จะต้องเป็นค่าบวกแน่นอน แต่การแปลงด้วยฟังก์ชัน nearPD จากแพ็คเกจเมทริกซ์ใน R จะมีประโยชน์


1

ΣYxΣx=ผมΣYΛV

ΣY=VΛVT=(VΛ)(ΛTVT)=AAT

Y=Ax

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