Tôi có ma trận trong đó mỗi hàng là mẫu từ bản phân phối. Tôi muốn so sánh các bản phân phối bằng cách sử dụng ks.test
và lưu thống kê thử nghiệm trong mỗi trường hợp. Cách đơn giản nhất để thực hiện điều này khái niệm là với một vòng lặp:Kiểm tra phân phối hàng khôn ngoan một cách hiệu quả
set.seed(1942)
mt <- rbind(rnorm(5), rnorm(5), rnorm(5), rnorm(5))
results <- matrix(as.numeric(rep(NA, nrow(mt))))
for (i in 2 : nrow(mt)) {
results[i] <- ks.test(x = mt[i - 1, ], y = mt[i, ])$statistic
}
Tuy nhiên, dữ liệu thực tế của tôi có ~ 400 cột và ~ 300.000 hàng cho một ví dụ duy nhất, và tôi có rất nhiều ví dụ. Vì vậy, tôi muốn điều này được nhanh chóng. Bài kiểm tra Kolmogorov-Smirnov không phức tạp về toán học, vì vậy nếu câu trả lời là "thực hiện nó trong Rcpp
", tôi sẽ chấp nhận một cách miễn cưỡng, nhưng tôi sẽ hơi ngạc nhiên - nó đã rất nhanh để tính toán trên một đĩa đơn cặp trong R.
Phương pháp tôi đã cố gắng nhưng đã không thể có được làm việc: dplyr
sử dụng rowwise/do/lag
, zoo
sử dụng rollapply
(đó là những gì tôi sử dụng để tạo ra các bản phân phối), và populating một data.table
trong một vòng lặp (chỉnh sửa: cái này hoạt động, nhưng nó vẫn còn chậm).
Bạn có thực sự đang sử dụng gói 'KernSmooth' không? 'ks.test' nằm trong gói' stats'. – davechilders
Bạn chính xác! Tôi đang sử dụng KernSmooth, nhưng không phải cho chức năng này - Tôi đang sử dụng nó để tạo ra các bản phân phối. Tôi sẽ chỉnh sửa. – Ajar