Mi piace avere il controllo sugli oggetti che creo, anche quando potrebbero essere arbitrari.
Si consideri, poi, che tutti i possibili covarianza matrici Σ può essere espresso nella forman×nΣ
Σ=P′ Diagonal(σ1,σ2,…,σn) P
dove è una matrice ortogonale e σ 1 ≥ σ 2 ≥ ⋯ ≥ σ n ≥ 0 .Pσ1≥σ2≥⋯≥σn≥0
Geograficamente questo descrive una struttura di covarianza con una gamma di componenti principali di dimensioni . Questi componenti puntano nelle direzioni delle righe di P . Vedere le figure in Analisi delle componenti principali, autovettori e autovalori per esempi con n = 3 . Impostando σ i si imposteranno le magnitudini delle covarianze e le loro dimensioni relative, determinando così qualsiasi forma ellissoidale desiderata. Le file di P orientano gli assi della forma come preferisci.σiPn=3σiP
Un vantaggio algebrico e di calcolo di questo approccio è che quando , Σ viene prontamente invertito (operazione che è un'operazione comune sulle matrici di covarianza):σn>0Σ
Σ−1=P′ Diagonal(1/σ1,1/σ2,…,1/σn) P.
Non ti interessano le direzioni, ma solo le gamme di dimensioni della ? Va bene: puoi facilmente generare una matrice ortogonale casuale. Avvolgi n 2 iid i valori normali standard in una matrice quadrata e poi ortogonali. Funzionerà quasi sicuramente (a condizione che n non sia enorme). La decomposizione QR lo farà, come in questo codiceσin2n
n <- 5
p <- qr.Q(qr(matrix(rnorm(n^2), n)))
Questo funziona perché la distribuzione multinormale a variabili così generata è "ellittica": è invariante sotto tutte le rotazioni e le riflessioni (attraverso l'origine). Pertanto, tutte le matrici ortogonali vengono generate in modo uniforme, come spiegato in Come generare punti distribuiti uniformemente sulla superficie della sfera dell'unità 3-d? .n
Un modo rapido per ottenere da P e σ i , dopo averli specificati o creati, utilizza e sfrutta il riutilizzo di array in operazioni aritmetiche, come in questo esempio con σ = ( σ 1 , … , σ 5 ) = ( 5 , 4 , 3 , 2 , 1 ) :ΣPσicrossprod
R
σ=(σ1,…,σ5)=(5,4,3,2,1)
Sigma <- crossprod(p, p*(5:1))
Come controllo, la decomposizione del valore singolare dovrebbe restituire sia che P ′ . Puoi ispezionarlo con il comandoσP′
svd(Sigma)
Sigma
Naturalmente, l' inverso si ottiene semplicemente cambiando la moltiplicazione di in una divisione:σ
Tau <- crossprod(p, p/(5:1))
Puoi verificarlo visualizzando zapsmall(Sigma %*% Tau)
, che dovrebbe essere la matrice di identità . Un inverso generalizzato (essenziale per i calcoli di regressione) si ottiene sostituendo qualsiasi σ i ≠ 0 con 1 / σ i , esattamente come sopra, ma mantenendo gli zeri tra gli σ i così come erano.n×nσi≠01/σiσi