วิธีการจัดเรียงข้อมูล 2D ใหม่เพื่อให้ได้ค่าสหสัมพันธ์อย่างไร


9

ฉันมีชุดข้อมูลอย่างง่ายต่อไปนี้ที่มีตัวแปรต่อเนื่องสองตัว เช่น:

d = data.frame(x=runif(100,0,100),y = runif(100,0,100))
plot(d$x,d$y)
abline(lm(y~x,d), col="red")
cor(d$x,d$y) # = 0.2135273

การกระจายฐาน

ฉันต้องจัดเรียงข้อมูลใหม่เพื่อให้มีความสัมพันธ์ระหว่างตัวแปรให้เป็น ~ 0.6 ฉันต้องการเก็บค่าเฉลี่ยและสถิติเชิงพรรณนาอื่น ๆ (sd, min, max, ฯลฯ .) ของตัวแปรทั้งสองให้คงที่

ฉันรู้ว่าเป็นไปได้ที่จะสร้างความสัมพันธ์กับข้อมูลที่ได้รับเช่น:

d2 = with(d,data.frame(x=sort(x),y=sort(y)))
plot(d2$x,d2$y)
abline(lm(y~x,d2), col="red")
cor(d2$x,d2$y) # i.e. 0.9965585

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

ถ้าฉันพยายามใช้sampleฟังก์ชั่นสำหรับงานนี้:

cor.results = c()
for(i in 1:1000){
    set.seed(i)
    d3 = with(d,data.frame(x=sample(x),y=sample(y)))
    cor.results =  c(cor.results,cor(d3$x,d3$y))
}

ฉันมีความสัมพันธ์ค่อนข้างหลากหลาย:

> summary(cor.results)
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
-0.281600 -0.038330 -0.002498 -0.001506  0.034380  0.288800

แต่ช่วงนี้ขึ้นอยู่กับจำนวนแถวในกรอบข้อมูลและลดลงตามขนาดที่เพิ่มขึ้น

> d = data.frame(x=runif(1000,0,100),y = runif(1000,0,100))
> cor.results = c()
> for(i in 1:1000){
+ set.seed(i)
+ d3 = with(d,data.frame(x=sample(x),y=sample(y)))
+ cor.results =  c(cor.results,cor(d3$x,d3$y))
+ }
> summary(cor.results)
      Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
-0.1030000 -0.0231300 -0.0005248 -0.0005547  0.0207000  0.1095000

คำถามของฉันคือ:

วิธีการจัดเรียงชุดข้อมูลดังกล่าวใหม่เพื่อให้ได้ความสัมพันธ์ (เช่น 0.7) (มันจะดีถ้าวิธีจะลบการพึ่งพาขนาดชุดข้อมูล)

คำตอบ:


6

นี่คือวิธีหนึ่งในการจัดเรียงข้อมูลที่สร้างจากการสุ่มตัวเลขเพิ่มเติม

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

อันดับแรกเราสร้างชุดข้อมูลจริง (เช่นในตัวอย่างของคุณ)

set.seed(1)
d <- data.frame(x = runif(100, 0, 100), y = runif(100, 0, 100))

cor(d$x, d$y)
# [1] 0.01703215

ตอนนี้เราระบุเมทริกซ์สหสัมพันธ์

corr <- 0.7  # target correlation
corr_mat <- matrix(corr, ncol = 2, nrow = 2)
diag(corr_mat) <- 1
corr_mat
#      [,1] [,2]
# [1,]  1.0  0.7
# [2,]  0.7  1.0

เราสร้างข้อมูลสุ่มหลังจากการแจกแจงปกติแบบ bivariate ด้วย , (สำหรับทั้งสองตัวแปร) และความสัมพันธ์ที่ระบุ ใน R สามารถทำได้ด้วยฟังก์ชั่นจากแพ็คเกจ เราใช้เพื่อระบุว่าความสัมพันธ์คือความสัมพันธ์เชิงประจักษ์ (ไม่ใช่ความสัมพันธ์ของประชากร)μ=0σ=1mvrnormMASSempirical = TRUE

library(MASS)
mvdat <- mvrnorm(n = nrow(d), mu = c(0, 0), Sigma = corr_mat, empirical = TRUE)

cor(mvdat)
#      [,1] [,2]
# [1,]  1.0  0.7
# [2,]  0.7  1.0

ข้อมูลสุ่มตรงกับความสัมพันธ์ที่ระบุอย่างสมบูรณ์

ต่อไปเราคำนวณอันดับของข้อมูลสุ่ม

rx <- rank(mvdat[ , 1], ties.method = "first")
ry <- rank(mvdat[ , 2], ties.method = "first")

ในการใช้อันดับสำหรับข้อมูลต้นฉบับdเราต้องเรียงลำดับข้อมูลดั้งเดิม

dx_sorted <- sort(d$x)
dy_sorted <- sort(d$y)

ตอนนี้เราสามารถใช้อันดับเพื่อระบุลำดับของข้อมูลที่เรียงลำดับแล้ว

cor(dx_sorted[rx], dy_sorted[ry])
# [1] 0.6868986

ความสัมพันธ์ที่ได้รับไม่ตรงกับที่ระบุอย่างสมบูรณ์ แต่ความแตกต่างค่อนข้างเล็ก

ที่นี่dx_sorted[rx]และdy_sorted[ry]เป็นเวอร์ชั่นต้นฉบับของข้อมูลต้นฉบับdอีกครั้ง


2
+1 มันค่อนข้างเท่ห์ ขั้นตอนคือ 1) สร้างข้อมูลปกติโดยมีความสัมพันธ์กับเพียร์สันที่เหมาะสม 2) สร้างข้อมูลดั้งเดิมและสร้างความสัมพันธ์ของข้อมูลที่ตรงกับอันดับความสัมพันธ์อย่างแน่นอน 3) ข้อมูลต้นฉบับมีความสัมพันธ์แบบเพียร์สันเดียวกัน ทำไมจึงใช้งานได้ มีผลการวิเคราะห์ที่บอกว่าทำหรือไม่? ความไม่เท่าเทียมกันในการรักษามาตรการความสัมพันธ์ต่าง ๆ ใกล้กันสำหรับการแจกแจงที่ดีหรืออะไร?
Bill

1
@Bill ฉันไม่สามารถอธิบายวิธีวิเคราะห์ได้ มันเป็นเพียงความคิดที่อยู่ในใจของฉัน อย่างไรก็ตามคุณสรุปขั้นตอนในวิธีที่ดี ขอบคุณ
Sven Hohenstein

2

ในการสร้างการแจกแจงแบบสม่ำเสมอที่มีสหสัมพันธ์ที่ระบุอัลกอริทึม Ruscio & Kaczetow (2008) จะทำงาน พวกเขาให้รหัส R จากนั้นคุณสามารถแปลงเป็นฟังก์ชันเชิงเส้นอย่างง่ายเพื่อให้ได้ค่าเป้าหมายค่าต่ำสุดค่าเฉลี่ยและ SD ของคุณ

อัลกอริทึม Ruscio & Kaczetow

ฉันจะสรุปคดี bivariate แต่ก็สามารถทำงานกับปัญหาหลายตัวแปรได้ uncorrelatedและจะมีการสร้างที่มีรูปร่างใด ๆ (เช่นเครื่องแบบ) จากนั้นและจะถูกสร้างขึ้นตามปกติ bivariate ที่มีความสัมพันธ์ระดับกลาง และถูกแทนที่ด้วยและในรูปแบบการรักษาอันดับ ปรับค่าสหสัมพันธ์กลางให้สูงขึ้นหรือต่ำลงทั้งนี้ขึ้นอยู่กับว่า r ( ) ต่ำหรือสูงเกินไป และถูกสร้างขึ้นเป็นค่าปกติ bivariate โดยมีค่าสหสัมพันธ์กลางใหม่ ทำซ้ำXoYoX1Y1X1Y1X0Y0X1,Y1X2Y2

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

สำหรับโพสต์ที่เกี่ยวข้อง: สหสัมพันธ์และการแจกแจงที่ไม่ปกติ

การเก็บรักษาสถิติเชิงพรรณนา

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

ให้และเป็นตัวแปรที่คุณสร้างขึ้นจากการวนซ้ำล่าสุดของอัลกอริทึม Ruscio & Kaczetow,และเป็นตัวแปรสุดท้ายของคุณที่คุณหวังว่าจะมี (พร้อมคำอธิบายเป้าหมาย) และและเป็นตัวแปรดั้งเดิมในชุดข้อมูลของคุณ XgYgXfYfXY

คำนวณ Xf=(Xgmin(X))(max(X)min(x))/(max(Xg)min(Xg))

ทำเช่นเดียวกันกับYf

อ้างอิง:

Ruscio, J. , & Kaczetow, W. (2008) การจำลองข้อมูลที่ไม่แปรหลายตัวแปรโดยใช้อัลกอริทึมซ้ำ การวิจัยพฤติกรรมหลายตัวแปร, 43, 355–381 ดอย: 10.1080 / 00273170802285693


1

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

r = .6
n = 1000
x = rnorm(n) 
z = rnorm(n) 
y = (r/(1-r^2)^.5)*x + z

cor(x,y)
plot(x,y)
abline(lm(y~x), col="red")

3
ไม่ฉันหมายถึง "resample" จริงๆ ฉันต้องการเก็บค่าเฉลี่ยและสถิติเชิงพรรณนาอื่น ๆ (sd, min, max) ของค่าคงที่ทั้งสองตัวแปร อัปเดตคำถาม
Yuriy Petrovskiy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.