Làm cách nào để sắp xếp lại dữ liệu 2D để có được mối tương quan nhất định?


9

Tôi có bộ dữ liệu đơn giản sau với hai biến liên tục; I E:

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

Phân phối cơ sở

Tôi cần sắp xếp lại dữ liệu theo cách để có mối tương quan giữa các biến là ~ 0,6. Tôi cần giữ phương tiện và thống kê mô tả khác (sd, min, max, v.v.) của cả hai biến không đổi.

Tôi biết có thể thực hiện hầu hết mọi tương quan với dữ liệu đã cho, ví dụ:

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

nhập mô tả hình ảnh ở đây

Nếu tôi cố gắng sử dụng samplechức năng cho nhiệm vụ này:

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))
}

Tôi nhận được khá nhiều mối tương quan:

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

nhưng phạm vi này phụ thuộc vào số lượng hàng trong khung dữ liệu và giảm khi tăng kích thước.

> 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

Câu hỏi của tôi là:

Làm cách nào để sắp xếp lại tập dữ liệu đó để có được mối tương quan nhất định (tức là 0,7)? (Sẽ rất tốt nếu phương thức sẽ loại bỏ sự phụ thuộc vào kích thước tập dữ liệu)

Câu trả lời:


6

Đây là một cách để sắp xếp lại dữ liệu dựa trên việc tạo thêm các số ngẫu nhiên.

xyxy

Đầu tiên, chúng tôi tạo tập dữ liệu thực tế (như trong ví dụ của bạn).

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

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

Bây giờ, chúng tôi chỉ định một ma trận tương quan.

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

μ=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

Các dữ liệu ngẫu nhiên hoàn toàn phù hợp với mối tương quan được chỉ định.

Tiếp theo, chúng tôi tính toán thứ hạng của dữ liệu ngẫu nhiên.

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

Để sử dụng thứ hạng cho dữ liệu gốc d, chúng ta phải sắp xếp dữ liệu gốc.

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

Bây giờ, chúng ta có thể sử dụng các cấp bậc để xác định thứ tự của dữ liệu được sắp xếp.

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

Mối tương quan thu được không hoàn toàn khớp với chỉ định, nhưng sự khác biệt là tương đối nhỏ.

Ở đây, dx_sorted[rx]dy_sorted[ry]được lấy lại các phiên bản của dữ liệu gốc d.


2
+1 Điều đó khá tuyệt. Các bước là 1) tạo dữ liệu bình thường với tương quan Pearson đúng, 2) tạo dữ liệu gốc và dữ liệu được tạo phù hợp chính xác với tương quan xếp hạng, 3) dữ liệu gốc có tương quan Pearson tương tự như bây giờ. Tại sao điều này làm việc? Có một kết quả phân tích nói rằng nó không? Bất bình đẳng ràng buộc giữ các biện pháp tương quan khác nhau gần nhau để phân phối hành vi tốt hoặc một cái gì đó?
Bill

1
@Bill Tôi không thể giải thích cách tiếp cận một cách phân tích. Nó chỉ là một ý tưởng nảy ra trong đầu tôi. Tuy nhiên, bạn đã tóm tắt các bước một cách tốt đẹp. Cảm ơn.
Sven Hohenstein

2

Để tạo hai phân phối đồng nhất với một mối tương quan xác định, thuật toán Ruscio & Kaczetow (2008) sẽ hoạt động. Họ cung cấp đang R . Sau đó, bạn có thể chuyển đổi với một hàm tuyến tính đơn giản để lấy mục tiêu tối thiểu, tối đa, trung bình và SD của bạn.

Thuật toán Ruscio & Kaczetow

XoYoX1Y1X1Y1X0Y0X1,Y1X2Y2

Lưu ý rằng điều này rất giống với giải pháp của @Sven Hohenstein, ngoại trừ việc nó lặp đi lặp lại, do đó, mối tương quan trung gian sẽ ngày càng gần hơn với tương quan mục tiêu cho đến khi chúng không thể phân biệt được. Ngoài ra, lưu ý rằng thuật toán này có thể được sử dụng để tạo ra một dân số lớn (ví dụ: N = 1 triệu) từ đó rút ra các mẫu nhỏ hơn - rất hữu ích nếu bạn cần phải có lỗi lấy mẫu.

Đối với một bài liên quan: Phân phối tương quan và không bình thường

Bảo tồn thống kê mô tả

Không có gì đảm bảo rằng thuật toán sẽ tạo ra các mô tả chính xác giống nhau. Tuy nhiên, vì giá trị trung bình và SD của phân phối đồng đều được xác định bởi min và max của nó, bạn chỉ cần điều chỉnh min và max để sửa mọi thứ.

XgYgXfYfXY

Xf=(Xgmin(X))(max(X)min(x))/(max(Xg)min(Xg))

Yf

Tài liệu tham khảo:

Ruscio, J., & Kaczetow, W. (2008). Mô phỏng dữ liệu đa biến bất thường bằng thuật toán lặp. Nghiên cứu hành vi đa biến, 43, 355 Đỉnh381. doi: 10.1080 / 00273170802285693


1

Tôi đoán rằng khi bạn nói "lấy mẫu lại", bạn có nghĩa là "mô phỏng", nghĩa chung hơn. Sau đây là cách ngắn gọn nhất mà tôi biết để mô phỏng dữ liệu thông thường, chia nhỏ với một mối tương quan xác định. Thay thế các giá trị mong muốn của riêng bạn cho r và 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
Không tôi thực sự có nghĩa là "mẫu lại". Tôi cần giữ phương tiện và thống kê mô tả khác (sd, min, max) của cả hai biến không đổi. Cập nhật câu hỏi.
Yuriy Petrovskiy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.