0
votes

Comment exécuter le test Wilcox sur toute combinaison de groupes à travers un grand nombre de fonctionnalités dans R?

J'ai une grande matrice ratase (appelez-la matrice code>) dans laquelle les lignes sont les caractéristiques et les colonnes sont les échantillons. Chaque colonne / échantillon appartient à 1 de 6 groupes. J'échantillons au hasard une certaine quantité de chaque groupe et stockez quel index ils appartiennent à la matrice d'origine.

> result
 [1] "Astro-Endo : 0.115331575924872"      "Astro-Micro : 0.935664046257304"     "Astro-Neuron : 0.0271849565394441"  
 [4] "Astro-Oligo : 0.00147694402781699"   "Astro-OPC : 0.0476580762532988"      "Endo-Micro : 0.297672151508384"     
 [7] "Endo-Neuron : 2.38134038927696e-06"  "Endo-Oligo : 0.0323129112432441"     "Endo-OPC : 0.451258974150342"       
[10] "Micro-Neuron : 0.000143621746738224" "Micro-Oligo : 0.0178171887595787"    "Micro-OPC : 0.0692129715131915"     
[13] "Neuron-Oligo : 6.68255453156116e-10" "Neuron-OPC : 6.201108273594e-07"     "Oligo-OPC : 0.142213241936393"  


0 commentaires

3 Réponses :


0
votes

Si j'ai tout compris, ce problème se résume à calculer une mesure de similarité pour un groupe de fonctionnalités. Je l'aborderais à l'aide de la bibliothèque code> proxy code> et proxy :: dist code> fonction, en particulier. Il permet d'utiliser une mesure de similarité personnalisée.

J'ai généré un ensemble de données synthétiques pour illustrer le processus: p>

test_fun <- function(x,y) {wilcox.test(x,y)$p.value}

fs <- c(feature_set_1, feature_set_2, feature_set_3)  
k <- 1
dist_mat <- vector(mode="list")
for (i in seq_along(fs)){
  for (j in 1:i){
    if (i>j) {
      dist_mat[[k]] <- proxy::dist(feature_df[fs[[i]], ], feature_df[fs[[j]], ], method = test_fun, by_rows = TRUE)
      k <- k+1
    }
  }
}


6 commentaires

Si je comprends bien ce que vous avez fait, c'est effectuer le test dans chaque ensemble de fonctionnalités qui n'est pas ce que je veux faire. Je voulais faire la même chose, mais à travers les différentes fonctionnalités. Encore une fois à nouveau sur l'exemple que j'ai fourni dans résultat J'ai le groupe Astro étant comparé à tous les différents groupes (Neuron, endo, etc.). Dans votre exemple qui traduirait la fonctionnalité_set_1 étant comparé à Feature_set_2 ainsi que toutes les combinaisons "3 Choisissez 2". Y-a-t-il un moyen de faire ça?


Pour clarifier plus loin, tous les éléments de fonctionnalité_set_1 auraient le test Wilcox réalisé à nouveau tous les éléments de fonctionnalité_set_2. Vous faites quelque chose de similaire mais vous faites toute la comparaison dans chacune des «fonctionnalités» individuelles.


Cela fonctionne certainement, mais il est un peu difficile à déchiffrer lorsque la nouvelle comparaison de fonctionnalités commence et se termine (je suppose que cela pourrait être corrigé avec un étiquetage?). Mais je suis inquiet pour les boucles car il a fallu quelques secondes à courir (j'ai une matrice de l'ordre de 30 000+ par 100 000+). Je sais que ça va prendre un moment, mais je vais le tester sur le jeu de données d'origine.


i et j sont des indices qui fonctionnent sur le jeu de fonctions. j est tel qu'il est inférieur à i . Cela permet une comparaison par paire sans exécutions en double (i, j est la même que J, I dans ce contexte). Pensez au triangle inférieur d'une matrice. Les boucles ne sont pas nécessairement lentes tant qu'elles sont correctement implémentées.


Oh, je viens de réaliser la façon dont vous avez abordé le problème était incorrect. J'ai réalisé que je ne l'ai pas expliqué aussi bien que je pensais et j'ai mal compris ce que vous avez fait. Donc, la méthode que vous avez écrite effectue le test en comparant TOUTES les fonctionnalités entre les différents échantillons. Je veux comparer une fonctionnalité mais depuis que chacun des éléments de "Feature_sets" contient une valeur pour cette fonctionnalité que je souhaite voir si une fonctionnalité est statistiquement différente parmi les trois "Feature_Sets". Désolé pour cette confusion.


Laissez-nous Continuez cette discussion en chat .



1
votes

J'utiliserais paireWaywilcox à partir de Scran pour cela - cela semble idéal pour votre problème. Il effectue des tests de somme de classement par paires de Wilcoxon pour chaque ligne entre groupes de colonnes, où les groupes sont un vecteur des assignations de colonne.

EDIT:

  • Groupes échantillonnés pour avoir un nombre égal d'éléments (colonnes), puisque l'OP semble vouloir le souhaiter.
  • a rendu la matrice moins clairsemé pour que cela ne soit plus clair qu'il ne compare pas les valeurs individuelles, mais des groupes de valeurs pour chaque rangée.

    Exemple: xxx

    créé sur 2020-06-18 par le package Reprex (v0.3.0)

    Edit # 2:

    juste à Voir ce que mon approche vous donnerait dans environ 1/20 000e fois (sur ma machine, au moins) de l'approche de stupidwolf, essayez-la avec son exemple MAT et groupe :: xxx

    créé sur 2020-06-19 par le Paquet Reprex (v0.3.0)


4 commentaires

Ce n'est pas clair pour moi comment / ce qu'il s'agit de comparer et de calculer les statistiques de test sur. Cela semble comparer chaque valeur individuelle dans la matrice à d'autres par opposition à la mise en commun d'une caractéristique des 6 groupes (chacune avec une quantité x d'échantillon du groupe respectif) et effectuant le test à ce sujet, ce que je veux faire .


Voir la poste éditée, essayant de faire le point qu'il fait ce qu'il est censé faire. De petites différences proviennent de la façon dont les liens sont cassés.


Hey le deuxième édition semble vraiment prometteur. Cependant, chaque fois que j'exécute res , je reçois une erreur indiquant erreur d'erreur dans eval (jsub, sddenv, parent.frame ()): objet 'rn' non trouvé . J'ai vérifié pour vous assurer que j'utilisais l'utilisation de @stupidwolf Mat et Groupe VARIABLES, mais je continue toujours à obtenir cette erreur.


RN est le nom de colonne généré automatiquement lors de la forcente d'une donnée.frame à une carte de données.Table à l'aide de Garder.Rowne = true . Dans la partie ultérieure du code, j'ai renommé que la colonne sur gène . Le code doit exécuter - voir l'exemple de reproductible complet lors de la modification finale. La deuxième modification n'a rien fait d'autre que d'appliquer un exemple différent et de contraindre les listes de résultats en une seule grande table.



1
votes

Très probablement Le code que vous n'avez pas de sens pour les personnes qui ne connaissent pas ce type de données. Très probablement, vous avez une matrice d'expression génique et pour chaque ligne (Gene), vous souhaitez effectuer un test Wilcox par paire. Vous échantillon des métadonnées, donc rang_index .

probablement pas la meilleure chose à faire statistiquement, mais c'est un moyen d'organiser vos données. D'abord définir des données: xxx

Nous pouvons échantillonner efficacement en faisant: xxx

ci-dessous Vous devez décider 1 . Qu'il s'agisse d'utiliser une correction du FDR (que vous puissiez faire après), et que vous souhaitez que vous souhaitiez de telles données massives.frame: xxx

Ce qui précède prend un moment, mais il Devrait courir OK, vous pouvez également envisager de le parallementer. Le résultat ressemble à ceci: xxx


1 commentaires

Comment parallementez-vous de telles opérations? Est-ce quelque chose que je dois écrire d'une manière ou quelque chose pour dire à mon ordinateur spécifiquement?