J'ai une matrice dans laquelle chaque ligne est un échantillon d'une distribution. Je veux faire une comparaison de roulement des distributions en utilisant ks.test
et enregistrer la statistique de test dans chaque cas. La façon la plus simple à mettre en œuvre ce plan conceptuel est une boucle:Effectuer efficacement un test de distribution par rangée
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
}
Cependant, mon vrai données a ~ 400 colonnes et rangées ~ 300.000 pour un seul exemple, et j'ai beaucoup d'exemples. Donc j'aimerais que ça soit rapide. Le test de Kolmogorov-Smirnov n'est pas compliqué du point de vue mathématique, donc si la réponse est "implémentez-le dans Rcpp
", je l'accepterai à contrecoeur, mais je serais plutôt surpris - il est déjà très rapide de calculer sur un seul paire R.
Méthodes J'ai essayé, mais ont été incapables de faire fonctionner correctement: dplyr
en utilisant rowwise/do/lag
, en utilisant zoo
rollapply
(qui est ce que j'utilise pour générer les distributions), et alimenter une data.table
dans une boucle (modifier: celui-ci fonctionne, mais c'est encore lent).
Utilisez-vous réellement le paquet 'KernSmooth'? 'ks.test' est dans le paquet' stats'. – davechilders
Vous avez raison! J'utilise KernSmooth, mais pas pour cette fonction - je l'utilise pour générer les distributions. Je vais éditer. – Ajar