จะสร้างเมทริกซ์สหสัมพันธ์แบบสุ่มขนาดใหญ่ที่มีความสัมพันธ์อย่างมากได้อย่างไร


25

ผมอยากจะสร้างสัมพันธ์เมทริกซ์แบบสุ่มของขนาดดังกล่าวว่ามีบางความสัมพันธ์ที่แข็งแกร่งในระดับปานกลางในปัจจุบัน:Cn×n

  • ตารางเมทริกซ์สมมาตรจริงของขนาด, เช่น ;n×nn=100
  • ค่าบวกแน่นอนคือค่า eigenvalues ​​ทั้งจริงและบวก
  • อันดับเต็ม
  • องค์ประกอบแนวทแยงทั้งหมดเท่ากับ ;1
  • ปิดเส้นทแยงมุมองค์ประกอบควรจะมีเหตุผลเหมือนกันกระจายบน1) การแจกแจงที่แน่นอนนั้นไม่สำคัญ แต่ฉันต้องการมีจำนวนมากพอสมควร (เช่น ) ของค่าที่มีขนาดใหญ่พอสมควร (เช่นที่มีค่าสัมบูรณ์หรือสูงกว่า) โดยพื้นฐานแล้วฉันต้องการตรวจสอบให้แน่ใจว่านั้นแทบจะไม่ทแยงมุมกับองค์ประกอบนอกแนวทแยงทั้งหมด(1,1)10%0.5C0

มีวิธีง่าย ๆ ที่จะทำมัน?

จุดประสงค์คือใช้เมทริกซ์แบบสุ่มดังกล่าวเพื่อวัดมาตรฐานของอัลกอริทึมที่ทำงานกับเมทริกซ์สหสัมพันธ์ (หรือความแปรปรวนร่วม)


วิธีการที่ใช้ไม่ได้ผล

ต่อไปนี้เป็นวิธีสร้างเมทริกซ์สหสัมพันธ์แบบสุ่มที่ฉันรู้ แต่ไม่ได้ผลกับฉันที่นี่:

  1. สร้างแบบสุ่มของขนาด, ศูนย์มาตรฐานและรูปแบบเมทริกซ์สหสัมพันธ์X หากนี้โดยทั่วไปจะส่งผลในทุกความสัมพันธ์นอกเส้นทแยงมุมเป็นรอบ0ถ้าความสัมพันธ์บางอย่างจะแข็งแรง แต่จะไม่เต็มอันดับXs×nC=1s1XXs>n0snC

  2. สร้างเมทริกซ์ที่แน่นอนเชิงบวกแบบสุ่มด้วยวิธีใดวิธีหนึ่งต่อไปนี้:B

    • สร้างตารางสุ่มและทำให้สมมาตรบวกแน่นอนaAB=AA

    • สร้างจัตุรัสสุ่ม , ทำให้สมมาตร , และทำให้เป็นบวกแน่นอนโดยการสลายตัวไอ -และการตั้งค่าลักษณะเฉพาะเชิงลบให้เป็นศูนย์:U หมายเหตุ: สิ่งนี้จะส่งผลให้เกิดเมทริกซ์ที่ขาดอันดับAE=A+AE=ยูSยูB=ยูม.ax{S,0}ยู

    • สร้าง orthogonal สุ่ม (เช่นโดยการสร้างจัตุรัสสุ่มและทำการย่อยสลาย QR หรือผ่านกระบวนการแกรม - ชามิดท์) และเส้นทแยงมุมมีองค์ประกอบบวกทั้งหมด รูปแบบQQADB=QDQ

    รับเมทริกซ์สามารถทำให้เป็นมาตรฐานได้อย่างง่ายดายเพื่อให้ทุกคนอยู่ในแนวทแยงมุม:ที่ไหนเป็นเมทริกซ์ทแยงมุมกับเส้นทแยงมุมเช่นเดียวกับB ทั้งสามวิธีการดังกล่าวข้างต้นในการสร้างผลในมีการปิดเส้นทแยงมุมองค์ประกอบใกล้0BC=D-1/2BD-1/2D=diagBBBC0


อัปเดต: เธรดที่เก่ากว่า

หลังจากโพสต์คำถามของฉันฉันพบสองรายการที่ซ้ำกันเกือบในอดีต:

น่าเสียดายที่เธรดเหล่านี้ไม่มีคำตอบที่น่าพอใจ (จนถึงตอนนี้ :)


1
คุณสามารถสร้างเมทริกซ์มุมฉากแบบสุ่มโดยกระบวนการ QR หรือ Gram-Schmidt นั่นจะเป็น "eigenvectors ของ PCA" เพิ่มสเกลลงในคอลัมน์ (เปลี่ยนเป็น "การโหลด") รับเมทริกซ์ความแปรปรวนร่วมจากการโหลดเหล่านี้ บางอย่างเช่นนั้น ...
ttnphns

1
อืม .. ลองจินตนาการว่าเราต้องการสร้างnXkเมทริกซ์การโหลด W ไม่สุ่มอย่างสมบูรณ์ แต่สิ่งที่เราต้องการ (มันจะWW'+diag(noise)กำหนดโควเมตริกเมทริกซ์ที่เราแสวงหางานเพียงอย่างเดียวคือการแก้ไขคอลัมน์ที่ปรับมาตรฐาน W (เช่น k "eigenvectors") เป็น orthogonal วิธีการใด ๆ ในการลดความสัมพันธ์ของตัวแปรที่สัมพันธ์กัน (นี่คือตัวแปร eigenvectors) อาจจะทำ (นี่เป็นความคิดที่ไม่แน่นอน)
14:08

1
Ah, @whuber ตอนนี้ฉันเห็นสิ่งที่คุณหมายถึง ใช่คุณพูดถูก: ถ้าองค์ประกอบนอกแนวทแยงทั้งหมดเหมือนกันและเท่ากับเมทริกซ์นั้นมีตำแหน่งเต็มและแน่นอน - บวกแน่นอน ... แน่นอนว่านี่ไม่ใช่สิ่งที่ฉันมีอยู่ในใจ: ฉันต้องการการกระจาย ขององค์ประกอบนอกแนวทแยงมุมในแต่ละเมทริกซ์ให้เป็น "สเปรด" อย่างสมเหตุสมผลไม่ใช่การกระจายข้ามเมทริกซ์ ...ρ
อะมีบากล่าวว่า Reinstate Monica

3
คุณอาจต้องการดูการกระจาย LKJ
shadowtalker

2
@ttnphns: ฉันคิดว่าในที่สุดฉันก็เข้าใจว่าคุณพูดถูก: สิ่งที่คุณแนะนำคือวิธีที่ง่ายที่สุดในการไปถึงเป้าหมาย ฉันเพิ่มการอัปเดตสำหรับคำตอบของฉันโดยใช้สิ่งที่คุณเขียนไว้ด้านบน
อะมีบาพูดว่า Reinstate Monica

คำตอบ:


14

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

ในหัวข้อนี้: วิธีสร้างเมทริกซ์สหสัมพันธ์แบบกึ่งบวกแบบสุ่มที่มีประสิทธิภาพได้อย่างไร - ฉันอธิบายและให้รหัสสำหรับอัลกอริธึมที่มีประสิทธิภาพสองวิธีในการสร้างเมทริกซ์สหสัมพันธ์แบบสุ่ม ทั้งคู่มาจากบทความของLewandowski, Kurowicka และ Joe (2009) ที่ @ssdecontrol อ้างถึงในความคิดเห็นข้างต้น (ขอบคุณมาก ๆ !)

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

วิธีการ Vine

สิ่งเดียวที่เปลี่ยนแปลงระหว่างย่อยเป็นพารามิเตอร์หนึ่งว่าการควบคุมวิธีการมากการกระจายตัวของความสัมพันธ์บางส่วนมีความเข้มข้นรอบ1±1

ฉันคัดลอกรหัสของฉันเพื่อสร้างเมทริกซ์เหล่านี้ที่นี่เช่นกันเพื่อแสดงว่ามันไม่นานกว่าวิธีอื่น ๆ ที่แนะนำที่นี่ โปรดดูคำตอบที่เชื่อมโยงของฉันสำหรับคำอธิบายบางอย่าง ค่าของbetaparamรูปด้านบนคือ (และมิติคือ ) 10050,20,10,5,2,1d100

function S = vineBeta(d, betaparam)
    P = zeros(d);           %// storing partial correlations
    S = eye(d);

    for k = 1:d-1
        for i = k+1:d
            P(k,i) = betarnd(betaparam,betaparam); %// sampling from beta
            P(k,i) = (P(k,i)-0.5)*2;     %// linearly shifting to [-1, 1]
            p = P(k,i);
            for l = (k-1):-1:1 %// converting partial correlation to raw correlation
                p = p * sqrt((1-P(l,i)^2)*(1-P(l,k)^2)) + P(l,i)*P(l,k);
            end
            S(k,i) = p;
            S(i,k) = p;
        end
    end

    %// permuting the variables to make the distribution permutation-invariant
    permutation = randperm(d);
    S = S(permutation, permutation);
end

อัปเดต: ค่าลักษณะเฉพาะ

@psarka ถามเกี่ยวกับค่าลักษณะเฉพาะของเมทริกซ์เหล่านี้ จากภาพด้านล่างนี้ผมได้วาดสเปกตรัมไอเก็ตค่าของเมทริกซ์สหสัมพันธ์หกค่าเดียวกันกับข้างบน สังเกตว่ามันค่อยๆลดลง ในทางตรงกันข้ามวิธีการที่แนะนำโดย @psarka มักจะส่งผลให้เกิดเมทริกซ์สหสัมพันธ์ที่มีค่าลักษณะเฉพาะขนาดใหญ่หนึ่งค่า

ค่าลักษณะเฉพาะของเมทริกซ์ด้านบน


ปรับปรุง วิธีการที่เรียบง่ายจริงๆ: ปัจจัยหลายประการ

คล้ายกับสิ่งที่ @ttnphns เขียนไว้ในความคิดเห็นด้านบนและ @GottfriedHelms ในคำตอบของเขาวิธีหนึ่งที่ง่ายมากในการบรรลุเป้าหมายของฉันคือการสุ่มสร้างปัจจัยการโหลดหลายปัจจัย( ) (เมทริกซ์สุ่มขนาดคูณ ) รูปแบบเมทริกซ์ความแปรปรวนร่วม (ซึ่งแน่นอนว่าจะไม่เต็มอันดับ) และเพิ่มมันเป็นเส้นทแยงมุมแบบสุ่มกับองค์ประกอบในเชิงบวกที่จะทำให้อันดับเต็ม เมทริกซ์ความแปรปรวนร่วมที่เกิดขึ้นสามารถทำให้เป็นมาตรฐานได้กลายเป็นเมทริกซ์สหสัมพันธ์ (ดังที่อธิบายไว้ในคำถามของฉัน) มันง่ายมากและใช้กลอุบาย นี่คือตัวอย่างการฝึกอบรมสหสัมพันธ์สำหรับW k × n W WD B = W W + Dk<nWk×nWWDB=WW+Dk=100,50,20,10,5,1 :

เมทริกซ์สหสัมพันธ์แบบสุ่มจากปัจจัยสุ่ม

เพียงข้อเสียคือเมทริกซ์ที่เกิดจะมีค่าลักษณะเฉพาะที่มีขนาดใหญ่และจากนั้นลดลงอย่างรวดเร็วเมื่อเทียบกับการสลายตัวที่ดีแสดงให้เห็นข้างต้นด้วยวิธีเถา นี่คือสเปกตรัมที่สอดคล้องกัน:k

eigenspectra ของเมทริกซ์เหล่านี้

นี่คือรหัส:

d = 100;    %// number of dimensions
k = 5;      %// number of factors

W = randn(d,k);
S = W*W' + diag(rand(1,d));
S = diag(1./sqrt(diag(S))) * S * diag(1./sqrt(diag(S)));

+1 อย่างไรก็ตามนี่เป็นเพียงการแจ้งเตือนไปยังส่วนสุดท้ายของคุณใน "วิธีการ" วิธีการที่ถูกต้องอย่างเคร่งครัดเรียกว่าคอลัมน์ของWเป็นมุมฉาก (เช่นโคไซน์ระหว่างพวกเขาเป็น 0) การสร้างแบบสุ่มWแน่นอนไม่ได้ให้ไว้ หากพวกเขาไม่ได้ตั้งฉาก - ปัจจัยคือเอียง (เรียกWว่าเป็นW_) - ทฤษฎีบทปัจจัยไม่ได้WW'แต่W_CW_'ด้วยCการเป็น "สหสัมพันธ์" (โคไซน์) ระหว่างปัจจัย ตอนนี้C=Q'Qด้วยQการเป็นเมทริกซ์การหมุนแบบ nonorthogonal ของการหมุนW_=inv(Q)'W(และอื่น ๆW=W_Q') สร้างQเมทริกซ์ที่มีคอลัมน์ ss = 1 และเมทริกซ์ ss = ขนาดของเมทริกซ์
ttnphns

... typo: ไม่แน่นอนW_=inv(Q)'W W_= W inv(Q)'
ttnphns

@ttnphns: สิ่งที่คุณพูดนั้นถูกต้อง แต่ฉันไม่คิดว่ามันสำคัญสำหรับการสร้างเมทริกซ์สหสัมพันธ์แบบสุ่ม ถ้าฉันสร้างสุ่มแล้วใช่คอลัมน์ของมันจะไม่เป็นมุมฉาก แต่ (หลังจากการทำให้เป็นแนวปกติเพื่อให้ได้แนวทแยง) จะยังคงเป็นเมทริกซ์สหสัมพันธ์อันดับที่มีค่าแนวทแยงขนาดใหญ่ สิ่งที่เป็นคำถามเกี่ยวกับ แน่นอนว่ามันง่ายมากที่จะจัดเรียงคอลัมน์ของล่วงหน้าก่อนฉันไม่เห็นว่าทำไมสิ่งนี้จึงจำเป็นในกรณีนี้ W W + D WWWW+DW
อะมีบาพูดว่า Reinstate Monica

1
แปลสิ่งนี้เป็น R:W = replicate(k, rnorm(d)); S = W%*%t(W) + diag(rnorm(d),nrow=d); S = diag(1/sqrt(diag(S)))%*%S%*%diag(1/sqrt(diag(S)))
Scott Worland

1
@Mihai จุดดีและคำแนะนำของคุณน่าจะง่ายที่สุด คุณสามารถทำได้S <- matrix(nearPD(S, corr = TRUE, keepDiag = TRUE)$mat@x,ncol(S),ncol(S))
Scott Worland

7

สิ่งที่เรียบง่าย แต่อาจจะใช้งานได้เพื่อจุดประสงค์ในการวัดเกณฑ์: นำ 2 ของคุณไปใช้และเชื่อมโยงความสัมพันธ์บางอย่างเข้ากับเมทริกซ์เริ่มต้น การกระจายค่อนข้างสม่ำเสมอและการเปลี่ยนแปลงคุณสามารถรับสมาธิใกล้กับ 1 และ -1 หรือใกล้ 0a

import numpy as np
from random import choice
import matplotlib.pyplot as plt

n = 100
a = 2

A = np.matrix([np.random.randn(n) + np.random.randn(1)*a for i in range(n)])
A = A*np.transpose(A)
D_half = np.diag(np.diag(A)**(-0.5))
C = D_half*A*D_half

vals = list(np.array(C.ravel())[0])
plt.hist(vals, range=(-1,1))
plt.show()
plt.imshow(C, interpolation=None)
plt.show()

การกระจายค่อนข้างสม่ำเสมอ ผลลัพธ์ของการแสดงผล


(+1) ขอบคุณ! ฉันแก้ไขคำตอบของคุณเพื่อเพิ่มรูปแบบการระบายสีที่น่าสนใจสำหรับ python และทำให้มันเข้ากันได้กับ python2 :) หวังว่ามันจะโอเค ฉันยังลบความคิดเห็นด้านบนเพื่อลบความยุ่งเหยิง (คุณสามารถลบของคุณได้เช่นกัน) ตอนนี้ฉันกำลังพยายามที่จะเข้าใจตรรกะของรหัสของคุณ คุณต้องการcrsอาร์เรย์จริงๆหรือ มีอิทธิพลอะไรบ้าง? ความรู้สึกของฉันคือคุณสามารถเพิ่มตัวเลขสุ่มจากในแต่ละแถวได้หรือไม่? สิ่งนี้คล้ายกับการใช้เมทริกซ์กับตัวอย่างที่สัมพันธ์กัน(ไม่ใช่ฟีเจอร์) แล้วคำนวณเมทริกซ์สหสัมพันธ์ตัวอย่างถูกต้องหรือไม่ [ - a , a ] Xk[-a,a]X
อะมีบาพูดว่า Reinstate Monica

ใช่คุณพูดถูก! (โอ้เด็กชายนั่นโง่จริงๆ: D) ฉันเปลี่ยนชิ้นส่วนแบบสุ่มเป็น randn (1) * a และตอนนี้มันดีกว่ามาก
psarka

ขอบคุณ! ตอนนี้คุณเพียงแค่ลบการกล่าวถึงข้างต้นโค้ดของคุณ ในขณะเดียวกันฉันพบคำถามเก่าที่เกือบจะซ้ำกันและโพสต์คำตอบที่นั่นแรงบันดาลใจโดยตรงจากคุณที่นี่: วิธีการสร้างเมทริกซ์สหสัมพันธ์แบบสุ่มที่มีการแจกแจงแบบเส้นทแยงมุมโดยทั่วไปประมาณค่าเบี่ยงเบนมาตรฐาน . ดูเหมือนว่าจะทำงานได้ดี! k
อะมีบาพูดว่า Reinstate Monica

เย็น! ฉันสงสัยว่ากระบวนการดังกล่าวส่งผลให้เกิดการกระจายที่รู้จักหรือไม่ การทดลองกับและแตกต่างกันฉันจะได้รูปร่างที่แตกต่างกันเล็กน้อย nan
psarka

ข้อเสียอย่างหนึ่งของวิธีนี้คือเมทริกซ์ความสัมพันธ์ที่เกิดขึ้นมีค่าลักษณะเฉพาะขนาดใหญ่หนึ่งค่า แต่ค่าที่เหลืออยู่เกือบจะเหมือนกัน ดังนั้นขั้นตอนนี้ไม่ได้ให้เมทริกซ์ความสัมพันธ์ "ทั่วไป" ... ไม่ใช่ว่าฉันระบุไว้ในคำถามของฉัน แต่ @ssdecontrol กล่าวถึงในความคิดเห็นข้างต้นว่ามีวิธีการตัวอย่างจากเมทริกซ์สหสัมพันธ์ทั้งหมด มันดูน่าสนใจ แต่ซับซ้อนกว่ามาก
อะมีบาพูดว่า Reinstate Monica

6

อืมหลังจากที่ฉันทำตัวอย่างในภาษา MatMate ของฉันฉันเห็นว่ามีคำตอบของงูหลามอยู่แล้วซึ่งอาจเป็นที่นิยมมากกว่าเพราะไพ ธ อนใช้กันอย่างแพร่หลาย แต่เนื่องจากคุณยังมีคำถามฉันแสดงวิธีการของฉันโดยใช้ Matmate-matrix-language อาจจะเป็นการเห็นแก่ตัวมากกว่า

วิธีที่ 1
(ใช้ MatMate):

v=12         // 12 variables
f=3          // subset-correlation based on 3 common factors
vg = v / f   // variables per subsets

 // generate hidden factor-matrix
             // randomu(rows,cols ,lowbound, ubound) gives uniform random matrix 
             //    without explicite bounds the default is: randomu(rows,cols,0,100)
L = {   randomu(vg,f)     || randomu(vg,f)/100  || randomu(vg,f)/100 , _
        randomu(vg,f)/100 || randomu(vg,f)      || randomu(vg,f)/100 , _
        randomu(vg,f)/100 || randomu(vg,f)/100  || randomu(vg,f)     }

 // make sure there is itemspecific variance
 // by appending a diagonal-matrix with random positive entries
L = L || mkdiag(randomu(v,1,10,20)) 
  // make covariance and correlation matrix
cov = L *'   // L multiplied  with its transpose
cor = covtocorr(cov)
                   set ccdezweite=3 ccfeldweite=8
                   list cor
cor = 
   1.000,   0.321,   0.919,   0.489,   0.025,   0.019,   0.019,   0.030,   0.025,   0.017,   0.014,   0.014
   0.321,   1.000,   0.540,   0.923,   0.016,   0.015,   0.012,   0.030,   0.033,   0.016,   0.012,   0.015
   0.919,   0.540,   1.000,   0.679,   0.018,   0.014,   0.012,   0.029,   0.028,   0.014,   0.012,   0.012
   0.489,   0.923,   0.679,   1.000,   0.025,   0.022,   0.020,   0.040,   0.031,   0.014,   0.011,   0.014
   0.025,   0.016,   0.018,   0.025,   1.000,   0.815,   0.909,   0.758,   0.038,   0.012,   0.018,   0.014
   0.019,   0.015,   0.014,   0.022,   0.815,   1.000,   0.943,   0.884,   0.035,   0.012,   0.014,   0.012
   0.019,   0.012,   0.012,   0.020,   0.909,   0.943,   1.000,   0.831,   0.036,   0.013,   0.015,   0.010
   0.030,   0.030,   0.029,   0.040,   0.758,   0.884,   0.831,   1.000,   0.041,   0.017,   0.022,   0.020
   0.025,   0.033,   0.028,   0.031,   0.038,   0.035,   0.036,   0.041,   1.000,   0.831,   0.868,   0.780
   0.017,   0.016,   0.014,   0.014,   0.012,   0.012,   0.013,   0.017,   0.831,   1.000,   0.876,   0.848
   0.014,   0.012,   0.012,   0.011,   0.018,   0.014,   0.015,   0.022,   0.868,   0.876,   1.000,   0.904
   0.014,   0.015,   0.012,   0.014,   0.014,   0.012,   0.010,   0.020,   0.780,   0.848,   0.904,   1.000

ปัญหานี่อาจเป็นได้ว่าเรากำหนดบล็อกของเมทริกซ์ย่อยที่มีความสัมพันธ์สูงภายในด้วยความสัมพันธ์เพียงเล็กน้อยระหว่างและนี่ไม่ใช่การเขียนโปรแกรม แต่โดยการต่อข้อมูลคงที่นิพจน์ บางทีวิธีการนี้อาจเป็นแบบอย่างที่ไพเราะกว่าในไพ ธ อน


วิธีที่ 2 (a)
หลังจากนั้นมีวิธีการที่แตกต่างไปจากเดิมอย่างสิ้นเชิงโดยที่เราเติมค่าความแปรปรวนร่วมที่เหลืออยู่โดยการสุ่มจำนวน 100 เปอร์เซ็นต์ลงในแฟกเตอร์การโหลดปัจจัย - เมทริกซ์ สิ่งนี้ทำได้ใน Pari / GP:

{L = matrix(8,8);  \\ generate an empty factor-loadings-matrix
for(r=1,8, 
   rv=1.0;    \\ remaining variance for variable is 1.0
   for(c=1,8,
        pv=if(c<8,random(100)/100.0,1.0); \\ define randomly part of remaining variance
        cv= pv * rv;  \\ compute current partial variance
        rv = rv - cv;     \\ compute the now remaining variance
        sg = (-1)^(random(100) % 2) ;  \\ also introduce randomly +- signs
        L[r,c] = sg*sqrt(cv) ;  \\ compute factor loading as signed sqrt of cv
       )
     );}

cor = L * L~

และเมทริกซ์สหสัมพันธ์ที่เกิดขึ้นคือ

     1.000  -0.7111  -0.08648   -0.7806   0.8394  -0.7674   0.6812    0.2765
   -0.7111    1.000   0.06073    0.7485  -0.7550   0.8052  -0.8273   0.05863
  -0.08648  0.06073     1.000    0.5146  -0.1614   0.1459  -0.4760  -0.01800
   -0.7806   0.7485    0.5146     1.000  -0.8274   0.7644  -0.9373  -0.06388
    0.8394  -0.7550   -0.1614   -0.8274    1.000  -0.5823   0.8065   -0.1929
   -0.7674   0.8052    0.1459    0.7644  -0.5823    1.000  -0.7261   -0.4822
    0.6812  -0.8273   -0.4760   -0.9373   0.8065  -0.7261    1.000   -0.1526
    0.2765  0.05863  -0.01800  -0.06388  -0.1929  -0.4822  -0.1526     1.000

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

เมทริกซ์ความสัมพันธ์ 100x100 มีความถี่ของความสัมพันธ์ดังต่อไปนี้ (ปัดเศษเป็น 1 ธันวาคม)

    e    f            e: entry(rounded) f: frequency
  -----------------------------------------------------
  -1.000, 108.000
  -0.900, 460.000
  -0.800, 582.000
  -0.700, 604.000
  -0.600, 548.000
  -0.500, 540.000
  -0.400, 506.000
  -0.300, 482.000
  -0.200, 488.000
  -0.100, 464.000
   0.000, 434.000
   0.100, 486.000
   0.200, 454.000
   0.300, 468.000
   0.400, 462.000
   0.500, 618.000
   0.600, 556.000
   0.700, 586.000
   0.800, 536.000
   0.900, 420.000
   1.000, 198.000

[อัพเดต] อืมเมทริกซ์ 100x100 มีเงื่อนไขที่ไม่ดี Pari / GP ไม่สามารถกำหนดค่าลักษณะเฉพาะได้อย่างถูกต้องด้วย polroots (charpoly ()) - ทำงานได้แม้จะมีความแม่นยำ 200 หลัก ฉันทำการหมุนแบบ Jacobi ไปยัง pca-form บน loadingsmatrix L และหาค่าลักษณะเฉพาะที่มีขนาดเล็กมากพิมพ์ลงในลอการิทึมจนถึงฐาน 10 (ซึ่งให้ตำแหน่งทศนิยมโดยประมาณ) อ่านจากซ้ายไปขวาแล้วตามลำดับ:

log_10(eigenvalues):
   1.684,   1.444,   1.029,   0.818,   0.455,   0.241,   0.117,  -0.423,  -0.664,  -1.040
  -1.647,  -1.799,  -1.959,  -2.298,  -2.729,  -3.059,  -3.497,  -3.833,  -4.014,  -4.467
  -4.992,  -5.396,  -5.511,  -6.366,  -6.615,  -6.834,  -7.535,  -8.138,  -8.263,  -8.766
  -9.082,  -9.482,  -9.940, -10.167, -10.566, -11.110, -11.434, -11.788, -12.079, -12.722
 -13.122, -13.322, -13.444, -13.933, -14.390, -14.614, -15.070, -15.334, -15.904, -16.278
 -16.396, -16.708, -17.022, -17.746, -18.090, -18.358, -18.617, -18.903, -19.186, -19.476
 -19.661, -19.764, -20.342, -20.648, -20.805, -20.922, -21.394, -21.740, -21.991, -22.291
 -22.792, -23.184, -23.680, -24.100, -24.222, -24.631, -24.979, -25.161, -25.282, -26.211
 -27.181, -27.626, -27.861, -28.054, -28.266, -28.369, -29.074, -29.329, -29.539, -29.689
 -30.216, -30.784, -31.269, -31.760, -32.218, -32.446, -32.785, -33.003, -33.448, -34.318

[อัปเดต 2]
วิธีที่ 2 (b)
การปรับปรุงอาจเป็นการเพิ่มความแปรปรวนของรายการเฉพาะให้อยู่ในระดับที่ไม่ได้อยู่ในระดับต่ำและลดลงเป็นปัจจัยทั่วไปที่มีจำนวนน้อยกว่าพอสมควร (ตัวอย่างเช่น

{  dimr = 100;
   dimc = sqrtint(dimr);        \\ 10 common factors
   L = matrix(dimr,dimr+dimc);  \\ loadings matrix 
                                \\     with dimr itemspecific and 
                                \\          dimc common factors
   for(r=1,dim, 
         vr=1.0;                \\ complete variance per item 
         vu=0.05+random(100)/1000.0;   \\ random variance +0.05
                                       \\ for itemspecific variance
         L[r,r]=sqrt(vu);              \\ itemspecific factor loading  
         vr=vr-vu;
         for(c=1,dimc,
                cv=if(c<dimc,random(100)/100,1.0)*vr;
                vr=vr-cv;
                L[r,dimr+c]=(-1)^(random(100) % 2)*sqrt(cv)
             )
        );}

   cov=L*L~
   cp=charpoly(cov)   \\ does not work even with 200 digits precision
   pr=polroots(cp)    \\ spurious negative and complex eigenvalues...

โครงสร้างของผลลัพธ์

ในแง่ของการกระจายความสัมพันธ์:ภาพ

ยังคงคล้ายกัน (เช่นการย่อยสลายไม่น่ารังเกียจโดย PariGP) แต่ค่าลักษณะเฉพาะเมื่อพบโดย jacobi - การหมุนของ loadingsmatrix ตอนนี้มีโครงสร้างที่ดีขึ้นสำหรับตัวอย่างที่คำนวณใหม่ฉันได้ค่าลักษณะเฉพาะเป็น

log_10(eigenvalues):
   1.677,   1.326,   1.063,   0.754,   0.415,   0.116,  -0.262,  -0.516,  -0.587,  -0.783
  -0.835,  -0.844,  -0.851,  -0.854,  -0.858,  -0.862,  -0.862,  -0.868,  -0.872,  -0.873
  -0.878,  -0.882,  -0.884,  -0.890,  -0.895,  -0.896,  -0.896,  -0.898,  -0.902,  -0.904
  -0.904,  -0.909,  -0.911,  -0.914,  -0.920,  -0.923,  -0.925,  -0.927,  -0.931,  -0.935
  -0.939,  -0.939,  -0.943,  -0.948,  -0.951,  -0.955,  -0.956,  -0.960,  -0.967,  -0.969
  -0.973,  -0.981,  -0.986,  -0.989,  -0.997,  -1.003,  -1.005,  -1.011,  -1.014,  -1.019
  -1.022,  -1.024,  -1.031,  -1.038,  -1.040,  -1.048,  -1.051,  -1.061,  -1.064,  -1.068
  -1.070,  -1.074,  -1.092,  -1.092,  -1.108,  -1.113,  -1.120,  -1.134,  -1.139,  -1.147
  -1.150,  -1.155,  -1.158,  -1.166,  -1.171,  -1.175,  -1.184,  -1.184,  -1.192,  -1.196
  -1.200,  -1.220,  -1.237,  -1.245,  -1.252,  -1.262,  -1.269,  -1.282,  -1.287,  -1.290

ขอบคุณมาก! น่าสนใจมาก แต่จะใช้เวลาสักครู่ในการแยกแยะ ...
อะมีบาพูดว่า Reinstate Monica

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

@ amoeba: คุณมีความสุขที่ได้พบสิ่งที่ดีสำหรับคุณ! มันเป็นคำถามที่น่าสนใจฉันจะกลับมาที่นี่ด้วยตัวเองบางทีอาจจะปรับปรุง / ปรับใช้ขั้นตอน MatMate (และทำให้รูทีนย่อย) ตามเอกสารที่คุณได้ทำ
หมวกกันน็อกกอตฟริด

2

ABλA+(1-λ)Bλ

ABCλAA+λBB+λCCΣλ=1λ0


AB

อา แต่จากอัลกอริธึมดังกล่าวและความหลากหลายที่เหมาะสมใน "จุดยอด" (นั่นคือเมทริกซ์) ที่กำหนด polytope ของคุณของเมทริกซ์สหสัมพันธ์เชิงบวกแน่นอนคุณสามารถใช้การสุ่มตัวอย่างการปฏิเสธเพื่อให้ได้ค่า eigenvalues ฯลฯ ที่คุณต้องการ อย่างไรก็ตามมันไม่ชัดเจนสำหรับฉันว่าพื้นฐานที่ดีจะเป็นอย่างไร ฟังดูเหมือนคำถามสำหรับคนที่เรียนพีชคณิตนามธรรมเร็วกว่าฉัน
Andrew M

สวัสดีอีกครั้งฉันอ่านบทความเกี่ยวกับการสุ่มตัวอย่างแบบสหสัมพันธ์แบบสุ่มและวิธีการหนึ่งจากนั้นสามารถใช้ในการทำสิ่งที่ฉันต้องการได้อย่างแท้จริง ฉันโพสต์คำตอบที่นี่คุณอาจสนใจที่จะดู! มันเชื่อมโยงไปยังคำตอบที่ละเอียดยิ่งขึ้นที่ฉันเขียนในเธรดอื่น
อะมีบาพูดว่า Reinstate Monica

2

R มีแพ็คเกจ (clusterGeneration) ที่ใช้วิธีใน:

  • โจเอช (2006) ความสัมพันธ์ฝ่ายผลิตสุ่มเมทริกซ์บนพื้นฐานของความสัมพันธ์บางส่วน วารสารการวิเคราะห์หลายตัวแปร, 97, 2177--2189

ตัวอย่าง:

> (cormat10 = clusterGeneration::rcorrmatrix(10, alphad = 1/100000000000000))
        [,1]   [,2]    [,3]     [,4]     [,5]   [,6]   [,7]    [,8]     [,9]   [,10]
 [1,]  1.000  0.344 -0.1406 -0.65786 -0.19411  0.246  0.688 -0.6146  0.36971 -0.1052
 [2,]  0.344  1.000 -0.4256 -0.35512  0.15973  0.192  0.340 -0.4907 -0.30539 -0.6104
 [3,] -0.141 -0.426  1.0000  0.01775 -0.61507 -0.485 -0.273  0.3492 -0.30284  0.1647
 [4,] -0.658 -0.355  0.0178  1.00000  0.00528 -0.335 -0.124  0.5256 -0.00583 -0.0737
 [5,] -0.194  0.160 -0.6151  0.00528  1.00000  0.273 -0.350 -0.0785  0.08285  0.0985
 [6,]  0.246  0.192 -0.4847 -0.33531  0.27342  1.000  0.278 -0.2220 -0.11010  0.0720
 [7,]  0.688  0.340 -0.2734 -0.12363 -0.34972  0.278  1.000 -0.6409  0.40314 -0.2800
 [8,] -0.615 -0.491  0.3492  0.52557 -0.07852 -0.222 -0.641  1.0000 -0.50796  0.1461
 [9,]  0.370 -0.305 -0.3028 -0.00583  0.08285 -0.110  0.403 -0.5080  1.00000  0.3219
[10,] -0.105 -0.610  0.1647 -0.07373  0.09847  0.072 -0.280  0.1461  0.32185  1.0000
> cormat10[lower.tri(cormat10)] %>% psych::describe()
   vars  n  mean   sd median trimmed mad   min  max range skew kurtosis   se
X1    1 45 -0.07 0.35  -0.08   -0.07 0.4 -0.66 0.69  1.35 0.03       -1 0.05

น่าเสียดายที่มันเป็นไปไม่ได้ที่จะจำลองความสัมพันธ์ที่ตามมาด้วยการแจกแจงแบบสม่ำเสมอกับสิ่งนี้ ดูเหมือนว่าจะสร้างความสัมพันธ์ที่แข็งแกร่งขึ้นเมื่อalphadตั้งค่าเป็นค่าที่น้อยมาก แต่ถึงแม้ว่า1/100000000000000ช่วงของความสัมพันธ์จะเพิ่มขึ้นเพียงประมาณ 1.40 เท่านั้น

อย่างไรก็ตามฉันหวังว่านี่อาจเป็นประโยชน์กับบางคน

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