IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Tirage aléatoire dans une matrice et simulations


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 20
    Par défaut Tirage aléatoire dans une matrice et simulations
    Bonjour

    Je me suis inscrit il y a peu et c’est donc ma première question. J’espère que tout sera clair, si non, je ferais en sorte d’apporter les informations manquantes.

    Je cherche à réaliser un test de puissance afin de savoir le nombre d’échantillons nécessaires pour mon échantillonnage (Intervalle de confiance correct…)

    1ère partie :

    • Je possède un jeu de données sous forme de matrice de 20 lignes et 15 colonnes (noté a=read.table…)




    • Je cherche à réaliser un tirage aléatoire de X valeurs dans des sous-unités (5*5, soit 12 sous-unités). Ne sachant pas comment faire pour que, dans la matrice principale, R comprennent qu’il y a 12 sous-unités, j’ai créé les sous-unités de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #Définition des sous matrices
    A1=a[1:5,1:5];A2=a[6:10,1:5];A3=a[11:15,1:5];A4=a[16:20,1:5];A5=a[1:5,6:10];A6=a[6:10,6:10];A7=a[11:15,6:10];A8=a[16:20,6:10];A9=a[1:5,11:15];A10=a[6:10,11:15];A11=a[11:15,11:15];A12=a[16:20,11:15]
    • A priori, je ne peux pas utiliser la fonction sample comme ça, je dois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    transformer ces "sous matrices" en réelles matrices :
    A1 <- as.matrix(A1);A2 <- as.matrix(A2);A3 <- as.matrix(A3);A4 <- as.matrix(A4);
    A5 <- as.matrix(A5);A6 <- as.matrix(A6);A7 <- as.matrix(A7);A8 <- as.matrix(A8);
    A9 <- as.matrix(A9);A10 <- as.matrix(A10);A11 <- as.matrix(A11);A12 <- as.matrix(A12);
    et là je peux réaliser la fonction sample, c'est bien cela ? (je bloquais avant parce que je n'utilisais pas as.matrix et il ne devait pas comprendre que c'était une matrice vu qu'il me sélectionnait toute la colonne et non une seule valeur).

    2ème partie :
    • Là, la fonction sample fonctionne. Je l'utilise en définissant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    samp<-list(s1=sample(A1,3,replace=F),sample(A2,3,replace=F),...,s12=sample(A12,3,replace=F))
    J'ai donc une liste avec mes 12 strates composées chacune d'une valeur.
    Je voudrais sélectionner uniquement celles où il y a au moins une valeur positive. J'avais pensé à utiliser la fonction if, mais je ne sais pas trop comment lui dire "si au moins une valeur est positive, je garde le lot, sinon je ne le prends pas en compte"

    Ceci me permettrait par la suite de réaliser la formule suivante : (pour exemple : 3 strates sélectionnées)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    N <- 12 #Nombre de strates 
    Nh <-25 #Nombre de mailles par strate
    nh <- X #Nombre de mailles secondaires par strate  
    v <- 3 #nombre de strates où l’espèce est observée lors de la première étape d’échantillonnage
    M <- v * Nh + (N-v) * nh #nombre de mailles échantillonnées
    mh <- c(7,14,14) #nombre de mailles dans le réseau (non vides dans la strate)
    y <- c(15,66,73) #valeurs de la variable d’intérêt observée
    pik <- 1 - choose(Nh-mh,3)/choose(Nh,nh) 
    tauhat <- sum(y/pik) #estimation de la population totale (HT)
    var.tauhat <- sum(((1-pik)*y^2)/(pik^2))
    c(tauhat,sqrt(var.tauhat)) #Estimation du total et Ecart-type
    IC95<- c(tauhat-((1.96*sqrt(var.tauhat))/sqrt(M)), tauhat+((1.96*sqrt(var.tauhat))/sqrt(M)))
    IC99<- c(tauhat-((2.58 *sqrt(var.tauhat))/sqrt(M)), tauhat+((2.58 *sqrt(var.tauhat))/sqrt(M)))
    Dois-je définir mh et y manuellement à chaque fois ou est-ce possible de lui indiquer que si l'unité A4 est sélectionnée (avec 1 valeur positive parmi les X sélectionnées) alors il y a mh=7 et y=66 ? (et donc définir chaque mh et y pour chaque strate)
    Pareil pour v, puis-je lui indiquer que si une strate est sélectionnée, il me compte comme 1 et donc que v soit la somme des 1 ?


    A terme je voudrais lancer la simulation un certain nombre de fois pour avoir différents intervalles de confiance pour différents nombres de sous-unités tirées aléatoirement (si je prends 3 valeurs dans la sous-unité ou 6 valeurs pour 100 simulations, je n’aurais pas le même intervalle de confiance et donc quel est le nombre adéquat à réaliser). Autrement dit faire 100 tirages aléatoires et calculer les IC pour chacun des tirages.


    Voilà, j’espère avoir été assez clair, c’est un peu flou pour moi au final, surtout si je dois réaliser une boucle pour la simulation.

    Je vous prie de m’excuser pour la non clarté si c’est le cas.

    Merci d'avance,
    Cordialement.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Data Scientist
    Inscrit en
    Août 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 139
    Par défaut
    Bonjour,

    Je vais déjà tâcher de répondre à un bout de ta question :
    Je voudrais sélectionner uniquement celles où il y a au moins une valeur positive. J'avais pensé à utiliser la fonction if, mais je ne sais pas trop comment lui dire "si au moins une valeur est positive, je garde le lot, sinon je ne le prends pas en compte"
    Pour cela je prends ta liste "samp". Pour savoir si il y a au moins un nombre positif dans chaque élément de la liste ou non, je te conseille d'utiliser la fonction lapply().
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lapply(samp,function(x) (sum(x > 0)) )
    Ceci te renvoie un vecteur de la même longueur que ta liste en mettant un TRUE si il y a au moins un nombre positif, et un FALSE sinon.

    En espérant t'avoir aidé, bon courage !

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 20
    Par défaut
    Bonjour !

    Merci pour la réponse.
    Cependant, ça ne me donne que de l'information et non pas une sélection. Au lieu d'avoir une liste avec 3 chiffres (et les valeurs associées), j'obtiens une liste avec 1 chiffre (0 à 3) mais je souhaiterais qu'il ne me garde pas les listes où il y a la valeur 0.

    En résumé :
    j'ai [[1]] 0 (ex 0 0 0) [[2]] 2 (ex 0 5 1) ...
    et je souhaiterais que ma liste ne contienne que les 1/2/3 et non pas les 0.

    Au final, il ne me resterait que les [[X]] possédant au moins 1 valeur positive (disons 2 sur 12 par exemple).
    Le but est de pouvoir l'implémenter dans une sorte de boucle afin de lancer la simulation plusieurs fois et donc ne pas avoir à sélectionner manuellement les listes ayant une valeur positive.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Data Scientist
    Inscrit en
    Août 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 139
    Par défaut
    Bonjour,

    Désolé mais je ne comprends vraiment pas ta question, aurais-tu l'exemple (en code R) d'une (ou plusieurs) liste(s) et ce que tu veux obtenir avec ?

    Je ne comprends pas trop si tu veux retenir uniquement les listes ou supprimer les valeurs au sein des éléments de la liste...

    Merci !

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 20
    Par défaut
    Bonjour,

    j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list(c(0,0,0),c(0,0,0),c(0,0,0),c(0,0,1),c(0,5,0),c(1,2,0),c(0,0,1),c(0,0,0),c(0,0,0),c(0,0,0),c(0,0,0),c(0,0,0))
    Je voudrais avoir au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    [[4]]
    [1] 0 0 1
     
    [[5]]
    [1] 0 5 0
     
    [[6]]
    [1] 1 2 0
     
    [[7]]
    [1] 0 0 1
    Comme cela, je n'aurais que les "listes" qui m'intéressent et donc je pourrais associer la valeur qui y est associée (par exemple pour [[4]] :mh4=1 ; y4=1 ; [[5]] mh5=7 ; y5=15 etc.) et l'idéal serait qu'en plus de me sélectionner seulement ces valeurs, une fois qu'elles sont sélectionnées, il m'y associe les deux valeurs correspondantes (mh et y).

  6. #6
    Membre expérimenté
    Homme Profil pro
    Data Scientist
    Inscrit en
    Août 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 139
    Par défaut
    Bonjour,

    Avec ce que je t'ai donné ceci est relativement simple d'extraire les éléments d'une liste que tu veux !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    liste <- list(c(0,0,0),c(0,0,0),c(0,0,0),
                 c(0,0,1),c(0,5,0),c(1,2,0),
                 c(0,0,1),c(0,0,0),c(0,0,0),
                 c(0,0,0),c(0,0,0),c(0,0,0))
     
    liste <- liste[as.logical(lapply(liste,function(x) sum(x>0) > 0 ))]
    Voilà !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Simuler un tirage aléatoire sur une loi exponentielle
    Par lobarth dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 27/06/2008, 09h41
  2. Tirage aléatoire dans une base donnée
    Par leloup84 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 30/01/2006, 16h13
  3. angles possibles dans une matrice
    Par bigbill dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 05/05/2005, 17h08
  4. [FLASH MX] Choisir un nombre aléatoire dans une liste
    Par grenatdu55 dans le forum Flash
    Réponses: 4
    Dernier message: 23/04/2005, 21h09
  5. Selection aléatoire dans une fouchette de 10%
    Par RobertDeNiroZ dans le forum Requêtes
    Réponses: 4
    Dernier message: 14/06/2004, 09h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo