สร้างคู่ของตัวเลขสุ่มกระจายอย่างสม่ำเสมอและมีความสัมพันธ์


14

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

ความคิดเกี่ยวกับวิธีการสร้างคู่ของตัวแปรเครื่องแบบที่มีความสัมพันธ์ที่กำหนด?


6
ที่เกี่ยวข้องอย่างใกล้ชิดstats.stackexchange.com/questions/30526 คุณยังต้องการตรวจสอบแท็กcopula - เพียงคลิกที่ลิงค์ที่นี่ เทคนิคที่รวดเร็วและสกปรกคือการปล่อยให้จะเหมือนกัน[ 0 , 1 ]และY = Xเมื่อX αและY = 1 + α - Xมิฉะนั้น ความสัมพันธ์คือρ = 2 ( α - 1 ) 3 + 1 , ดังนั้นα = 1 -X[0,1]Y=XXαY=1+αXρ=2(α1)3+1ไม่หลอกลวง แต่ copulas จะช่วยให้คุณควบคุมได้มากขึ้น ... α=1((1ρ)/2)1/3
whuber

ขอบคุณสำหรับความคิดเห็น แต่ใช่ผมคิดว่าวิธีการนี้เป็นจริง "สกปรก"
Onturenio

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

คำถามนี้ถูกตอบโดยบังเอิญในการตอบคำถามที่เกี่ยวข้องอย่างใกล้ชิด: วิธีสร้างคู่ RVs ที่มีความสัมพันธ์การถดถอยเชิงเส้น เนื่องจากความชันของการถดถอยเชิงเส้นมีความสัมพันธ์ในวิธีคำนวณค่าสัมประสิทธิ์สหสัมพันธ์และความลาดชันที่เป็นไปได้ทั้งหมดสามารถสร้างขึ้นได้จึงให้วิธีการผลิตสิ่งที่คุณต้องการอย่างแท้จริง ดูstats.stackexchange.com/questions/257779/...
whuber

1
โปรดดูstats.stackexchange.com/questions/31771ซึ่งตอบคำถามทั่วไปของเครื่องแบบสุ่มสามชุด
whuber

คำตอบ:


16

ฉันไม่ได้ตระหนักถึงวิธีสากลในการสร้างตัวแปรสุ่มที่มีความสัมพันธ์กับการแจกแจงที่กำหนดใด ๆ ดังนั้นฉันจะเสนอวิธีการเฉพาะกิจเพื่อสร้างคู่ของตัวแปรสุ่มแบบกระจายที่มีความสัมพันธ์ (Pearson) ที่กำหนด โดยไม่สูญเสียความสามารถทั่วไปฉันคิดว่าการกระจายส่วนต่างที่ต้องการคือชุดมาตรฐาน (เช่นการสนับสนุนคือ )[0,1]

วิธีการเสนออาศัยดังต่อไปนี้:
a) สำหรับตัวแปรสุ่มเครื่องแบบมาตรฐานและU 2ที่มีฟังก์ชั่นการจัดจำหน่ายนั้นF 1และF 2เรามีF ฉัน ( U ฉัน ) = U ฉันสำหรับฉัน= 1 , 2 ดังนั้นตามคำจำกัดความของสเปียร์แมน rhoคือ ρ S ( U 1 , U 2 ) = c o r r ( Fยู1ยู2F1F2Fผม(ยูผม)=ยูผมผม=1,2 ดังนั้นค่าสัมประสิทธิ์สหสัมพันธ์ของสเปียร์แมนและค่าสัมประสิทธิ์สหสัมพันธ์ของเพียร์สันมีค่าเท่ากัน (เวอร์ชั่นตัวอย่างอาจแตกต่างกัน)

ρS(ยู1,ยู2)=โอRR(F1(ยู1),F2(ยู2))=โอRR(ยู1,ยู2).

b) ถ้าเป็นตัวแปรสุ่มที่มีระยะขอบอย่างต่อเนื่องและGaussian copula ที่มีสัมประสิทธิ์สหสัมพันธ์ (Pearson) ρดังนั้น Rho ของ Spearman คือ ρ S ( X 1 , X 2 ) = 6X1,X2ρ สิ่งนี้ทำให้ง่ายต่อการสร้างตัวแปรสุ่มที่มีค่า Rho ของ Spearman ที่ต้องการ

ρS(X1,X2)=6πarcsin(ρ2).

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

การจำลองขั้นตอนวิธี
Let หมายถึงระดับที่ต้องการความสัมพันธ์และnจำนวนคู่ที่จะสร้าง อัลกอริทึมคือ:rn

  1. Compute )ρ=2sin(rπ/6)
  2. สร้างคู่ของตัวแปรสุ่มจากเกาส์เกา (เช่นด้วยวิธีนี้ )
  3. ทำซ้ำขั้นตอนที่ 2 ครั้งn

ตัวอย่าง
โค้ดต่อไปนี้เป็นตัวอย่างของการใช้อัลกอริทึมนี้โดยใช้ R โดยมีความสัมพันธ์เป้าหมายและn = 500คู่r=0.6n=500

## Initialization and parameters 
set.seed(123)
r <- 0.6                            # Target (Spearman) correlation
n <- 500                            # Number of samples

## Functions
gen.gauss.cop <- function(r, n){
    rho <- 2 * sin(r * pi/6)        # Pearson correlation
    P <- toeplitz(c(1, rho))        # Correlation matrix
    d <- nrow(P)                    # Dimension
    ## Generate sample
    U <- pnorm(matrix(rnorm(n*d), ncol = d) %*% chol(P))
    return(U)
}

## Data generation and visualization
U <- gen.gauss.cop(r = r, n = n)
pairs(U, diag.panel = function(x){
          h <- hist(x, plot = FALSE)
          rect(head(h$breaks, -1), 0, tail(h$breaks, -1), h$counts/max(h$counts))})

ในภาพด้านล่างพล็อตแนวทแยงแสดงฮิสโทแกรมของตัวแปรและU1และแผนการปิดเส้นทแยงมุมแสดงแผนการกระจาย U 1และ U 2 U2U1U2ป้อนคำอธิบายรูปภาพที่นี่

โดย constuction ตัวแปรสุ่มมีอัตรากำไรที่สม่ำเสมอและค่าสัมประสิทธิ์สหสัมพันธ์ (ใกล้) Rแต่เนื่องจากผลกระทบของการสุ่มตัวอย่างที่ค่าสัมประสิทธิ์สหสัมพันธ์ของข้อมูลจำลองไม่ว่าเท่ากับRrr

cor(U)[1, 2]
# [1] 0.5337697

โปรดทราบว่าgen.gauss.copฟังก์ชั่นควรทำงานกับตัวแปรมากกว่าสองตัวแปรเพียงแค่ระบุเมทริกซ์สหสัมพันธ์ที่ใหญ่ขึ้น

การศึกษา
แบบจำลองการศึกษาแบบจำลองต่อไปนี้ซ้ำสำหรับความสัมพันธ์เป้าหมายr=0.5,0.1,0.6แสดงให้เห็นว่าการกระจายของสัมประสิทธิ์สหสัมพันธ์แปรเปลี่ยนเป็นความสัมพันธ์ที่ต้องการเมื่อขนาดตัวอย่างเพิ่มขึ้นn

## Simulation
set.seed(921)
r <- 0.6                                                # Target correlation
n <- c(10, 50, 100, 500, 1000, 5000); names(n) <- n     # Number of samples
S <- 1000                                               # Number of simulations

res <- sapply(n,
              function(n, r, S){
                   replicate(S, cor(gen.gauss.cop(r, n))[1, 2])
               }, 
               r = r, S = S)
boxplot(res, xlab = "Sample size", ylab = "Correlation")
abline(h = r, col = "red")

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


3
วิธีการทั่วไปในการสร้างการกระจายหลายตัวแปรที่มีความสัมพันธ์กับการได้รับการกระจายร่อแร่จะเรียกว่าเป็นตัวเชื่อม
whuber

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

ขอบคุณ @QuantIbex แต่ฉันไม่เข้าใจว่าทำไม"a) บอกเป็นนัย ๆ ว่าสัมประสิทธิ์สหสัมพันธ์ของสเปียร์แมนและ (เพียร์สัน) สำหรับตัวแปรสุ่มที่มีมาร์
จิ้น

2
[1,1]

1
@Quantibex ฉันใช้เสรีภาพในการเพิ่มประโยคที่ชี้ให้เห็นว่าgen.gauss.copฟังก์ชั่นของคุณ จะทำงานได้มากกว่าสองตัวแปรด้วยการปรับแต่ง (เล็กน้อย) หากคุณไม่ชอบการเพิ่มหรือต้องการที่จะนำมันแตกต่างกันโปรดเปลี่ยนหรือเปลี่ยนแปลงได้ตามต้องการ
Glen_b -Reinstate Monica

0

u1U(0,1)u1w1U(0,1)I=1u1w2U(0,1)I=0u1U(0,1)u2

E(u1u2)=E[Iw1+(1I)w2][Iw1+(1I)w3]

I(I1)=0I2=I(1I)2=(1I)I01Iw

E(u1u2)=E(I)E(w12)+E(1I)E(w2)E(w3) =pE(w12)+(1p)/4

V(W1)=1/12, เราได้รับ E(W12)=1/3ดังนั้น E(u1u2)=p/12+1/4, that is: cov(u1u2)=p/12. Since V(u1)=V(u2)=1/12, we get finally that cor(u1,u2)=p.


0

Here is one easy method for positive correlation: Let (u1,u2)=Iw1+(1I)(w2,w3), where w1,w2, and w3 are independent U(0,1) and I is Bernoulli(p). u1 and u2 will then have U(0,1) distributions with correlation p. This extends immediately to k-tuples of uniforms with compound symmetric variance matrix.

If you want pairs with negative correlation, use (u1,u2)=I(w1,1w1)+(1I)(w2,w3), and the correlation will be p.


Can you add a short proof of why this works?
The Laconic

if your want to be computationally efficient, u1=w1 also produces the same correlation (both positive and negative cases)
Anvit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.