+1 till @ user11852 och @ jem77bfp, det här är bra svar. Låt mig närma mig detta från ett annat perspektiv, inte för att jag tycker att det nödvändigtvis är bättre i praktiken utan för att jag tycker att det är lärorikt. Här är några relevanta fakta som vi redan vet:
- $ r $ är regressionslinjens lutning när både $ X $ och $ Y $ är standardiserade , dvs $ \ mathcal N (0,1) $,
-
$ r ^ 2 $ är andelen av variansen i $ Y $ hänförlig till variansen i $ X $,
(även från regler för avvikelser):
- variansen för en slumpmässig variabel multiplicerad med en konstant är konstant kvadrat gånger den ursprungliga variansen:
$$ \ text {Var} [aX] = a ^ 2 \ text {Var} [X] $$ - varians add , dvs variansen av summan av två slumpmässiga variabler (förutsatt att de är oberoende) är summan av de två varianserna:
$$ \ text {Var} [X + \ varepsilon] = \ text {Var} [X] + \ text {Var} [\ varepsilon] $$
Nu kan vi kombinera dessa fyra fakta för att skapa två vanliga normala variabler vars populationer kommer att ha en given korrelation, $ r $ (mer korrekt, $ \ rho $), även om de prover du genererar kommer att ha provkorrelationer som varierar. Tanken är att skapa en pseudorandom-variabel, $ X $, det vill säga normal, $ \ mathcal N (0,1) $, och sedan hitta en koefficient, $ a $ och en felvarians, $ v_e $, så att $ Y \ sim \ mathcal N (0, a ^ 2 + v_e) $, där $ a ^ 2 + v_e = 1 $. (Observera att $ | a | $ måste vara $ \ le 1 $ för att detta ska fungera, och att dessutom $ a = r $.) Således börjar du med $ r $ som du vilja; det är din koefficient, $ a $. Då räknar du ut den felvarians som du behöver, det är $ 1-r ^ 2 $. (Om din programvara kräver att du använder standardavvikelsen, ta kvadratroten av det värdet.) Slutligen, för varje pseudorandom-variat, $ x_i $, som du har genererat, generera en pseudorandom-felvariat, $ e_i $, med lämplig felvarians $ v_e $, och beräkna den korrelerade pseudorandomvarianten, $ y_i $, genom att multiplicera och lägga till.
Om du vill göra detta i R kan följande kod fungera för dig:
correlatedValue = function (x, r) {r2 = r ** 2 ve = 1-r2 SD = sqrt (ve) e = rnorm (längd (x), medelvärde = 0, sd = SD) y = r * x + e retur (y)} uppsättning .frö (5) x = rnorm (10000) y = korreleradVärde (x = x, r = .5) cor (x, y) [1] 0.4945964
(Redigera: Jag glömde att nämna :) Som jag har beskrivit det, ger denna procedur dig två vanliga normala korrelerade variabler. Om du inte vill ha standard normaler men vill att variablerna ska ha vissa specifika medel (inte 0) och SD (inte 1) kan du transformera dem utan att påverka korrelationen. Således skulle du subtrahera det observerade medelvärdet för att säkerställa att medelvärdet är exakt $ 0 $, multiplicera variabeln med den SD du vill ha och lägg sedan till det medelvärde du vill ha. Om du vill att det observerade medelvärdet ska fluktuera normalt runt det önskade medelvärdet, skulle du lägga till den ursprungliga skillnaden tillbaka. I grund och botten är detta en omvandling av z-poäng. Eftersom detta är en linjär transformation kommer den transformerade variabeln att ha samma korrelation med den andra variabeln som tidigare.
Återigen låter det här, i sin enklaste form, bara generera ett par av korrelerade variabler (detta kan skalas upp, men blir ful snabbt), och är verkligen inte bekvämaste sättet att få jobbet gjort. I R vill du använda ? Mvrnorm i paketet MASS, både för att det är lättare och för att du kan generera många variabler med en given populationskorrelationsmatris. Ändå tycker jag att det är värt att ha gått igenom denna process för att se hur några grundläggande principer spelar ut på ett enkelt sätt.