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 selon des élements


Sujet :

R

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 20
    Points : 8
    Points
    8
    Par défaut Tirage aléatoire selon des élements
    Bonjour

    Je rencontre un petit soucis que je n'arrive pas à résoudre...

    Je souhaiterai effectuer un tirage aléatoire de 1 à 12 éléments de mon tableau, stocker les résultats et appliquer mon code.

    J'ai 12 Unités ayant chacune 25 pixels (25 chiffres). Je souhaiterai donc réaliser un premier tirage aléatoire de mes 12 Unités (et le répéter 100 fois) en tirant 1 à 12 Unités et stocker les résultats et appliquer mon second tirage aléatoire sur les pixels (avoir un tirage répété 100 fois pour 1 unités, pour 2, etc.)

    Voici les données (nom = Test2.csv):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    V1  V2
    A1  0
    A1  0
    A1  2
    ...
    A12 20
    A12 0
    Voici le code que j'applique pour les pixels et qui est fonctionnel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    setwd("C:/Users/Geoffroy/Desktop/Stage 2015/Biblio/R")
    Tab=read.table("Test2.csv",sep=";",h=F)
     
    #Nombre d'élements à  tirer
    n1=3
    nsimu=100
     
    Simu <- function (Tab, n1, nsimu) {
      #Somme des valeurs de chaque pixel pour une Grande Unité (GU)
      #Donne les effectifs par GU (de 1 a 12)
      library(doBy) #Appel de la librairie pour réaliser le summaryBy
      Someff <- summaryBy(V2~V1, data=Tab, FUN=sum)
     
      #changement des noms des colonnes de Someff
      names(Someff)<- c("V1", "V2.eff")
     
      #Effectif total (toutes GU)
      Efftot <- colSums(Tab["V2"])
     
      #Nombre de cases non vides par GU
      Pixnv <- data.frame(Someff["V1"], "V2"=(25-table(Tab)[, 1]))
      names(Pixnv)<- c("V1", "V2.NV")
     
      #Formule générale
      N <- Z #Nombre de GU
      Nh <- 25 #Nombre de pixels par GU
     
      dta <- lapply(n1, function (j) {   
        nh <- j #Nombre de pixels secondaires par GU
     
        ## Début de la simulation ##
        resSimu <- lapply(seq(nsimu), function (i) {
          #Séparation de chaque Grande unité (liste)
          #Tab.split <- split(Tab, as.factor(Tab$V1))
          #Tirage aléatoire parmi chaque GU
          #Tab.sample <- lapply(Tab.split, function(x) x <- x[sample(1:nrow(x), n1, replace=F), ])
          Tab.sample <- by(Tab, Tab$V1, function(x) x <- x[sample(1:nrow(x), j, replace=F), ])
     
          #Transformation en dataframe des listes obtenues après tirage aléatoire
          Tab.sample.df <- do.call(rbind.data.frame, Tab.sample) #Obtention data frame avec les 3 valeurs tirées par GU
     
          #Affichage du nombre de valeur supérieures à "0" par GU
          Tabs.df <- summaryBy(V2~V1, data=Tab.sample.df, FUN=function(x) (sum(x > 0)))
     
          #Changement des noms des colonnes du data frame
          names(Tabs.df) <- c("V1.1", "V2.1")
     
          #Compilation des data frame m et Som (via noms des GU)
          #nouveau data frame avec somme des effectifs par GU et nombre valeurs
          #positives avec tirage aléatoire de n1 valeurs
          T1 <- merge(Tabs.df, Someff , by.x = "V1.1", by.y = "V1")
     
          #Compilation du data frame créé et data frame nombre pixels non vides par GU
          #GU // Somme eff // Nombre de valeurs >0 parmi n1 // Nombre pixels non vides
          Tab.merge <- merge(T1, Pixnv, by.x = "V1.1", by.y = "V1")
     
          #Création data frame avec valeur de y (eff par GU)
          d2 <- data.frame(Someff["V1"], ifelse(Tab.merge[, 2]>0, Tab.merge[, 3], 0))
          names(d2) <- c("V1", "y")
     
          #Création data frame avec valeur de mh (eff par GU)
          d3 <- data.frame(Someff["V1"], ifelse(Tab.merge[, 2]>0, Tab.merge[, 4], 0))
          names(d3) <- c("V1", "mh")
     
          #Transformation des data frame en vecteur
          d2.1 <- as.vector(d2[, "y"])
          d3.1 <- as.vector(d3[, "mh"])
     
          #Sélection des valeurs supérieures à 0
          y <- d2.1[as.logical(lapply(d2.1, function(x) sum(x>0) > 0 ))]
          mh <- d3.1[as.logical(lapply(d3.1, function(x) sum(x>0) > 0 ))]
     
          #Formule de la Variable v
          v <- sum(ifelse(Tab.merge["V2.1"]>0, 1, 0))
     
          #Formule générale
          # N <- 12 #Nombre de GU
          # Nh <- 25 #Nombre de pixels par GU
          # nh <- n1 = j #Nombre de pixels secondaires par GU
          M <- v * Nh + (N-v) * nh #nombre de pixels échantillonnées
          pik <- 1 - choose(Nh-mh, j)/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
          qnorm(0.975)
          IC95 <- c(tauhat)
          #IC95 <- c(tauhat-((qnorm(0.975)*sqrt(var.tauhat))/sqrt(M)), tauhat+((qnorm(0.975)*sqrt(var.tauhat))/sqrt(M)))
          #IC95.1 <- c(tauhat-((qnorm(0.975)*sqrt(var.tauhat))/sqrt(j*N)), tauhat+((qnorm(0.975)*sqrt(var.tauhat))/sqrt(j*N)))
          #IC95.2<-  c(tauhat-((qnorm(0.975)*(sqrt(var.tauhat)))), tauhat+((qnorm(0.975)*(sqrt(var.tauhat)))))
          return(IC95)
        })
     
        aa <- do.call(rbind.data.frame, resSimu)
        names(aa) <- c("A1")
        result.split <- split(aa, as.factor(aa$"A1"))
        cc <- reshape2::melt(result.split)
        cc <- data.frame(cc, n1 = j)
        return(cc)
      })
      dta <- do.call("rbind", dta)
      return(dta)
    }
     
    dta <- Simu(Tab, 2:25, 100)
    boxplot(dta[,2]~dta[,4])
     
    #Virer IC, affichage que de Tauhat
    #100 valeurs Tauhat pour n1--> 2:25
     
    #Calcul moyenne et standard deviation (ecart type) de mes 100 valeurs
    X=summaryBy(value~n1,dta,FUN=c(mean,sd))
    #calcul erreur standard
    X2=cbind(X,(X[,3]/sqrt(100)))
    names(X2)<-c("n1","value.mean","value.sd","value.se")
     
    #Application ggplot pour graphique
    #geompoint --> affiche un point pour la valeur moyenne
    #geombar --> affiche intervalle de confiance
    #geomline --> relie les points
    library(ggplot2)
    ggplot(X2, aes(x=n1, y=value.mean)) + geom_point(size=4)+ geom_line()+
      geom_errorbar(aes(ymin=value.mean-value.se, ymax=value.mean+value.se), colour="black", width=.1)
    Ce code me donne ce que je souhaite (à savoir : estimation de mon effectif suivant que je tire 2 à 25 pixels par Unité)
    --------------------------------------------------------------------------------------

    Je souhaiterai donc réaliser la même chose mais avec une pré-étape --> Sélectionner 1 à 12 Unités et appliquer le code sur ces 1 à 12 unités et obtenir une estimation de mes effectifs suivant que je tire 1 à 12 Unités et 2 à 25 pixels.

    J'ai réalisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Z=11
    #Sélection aléatoire de GU parmi les 12 (ne seront pas prises)
    Group <- summaryBy(V2~V1, data=Tab, FUN=sum)
    Tab2<-sample(Group$V1,Z, replace=FALSE)
     
    #Sélection des GU prises (12-Z)
    Tab<- Tab[!(Tab$V1 %in% Tab2),]
    Cependant, ça reste du manuel et surtout il n'y a qu'un seul tirage pour Z unités... alors que je souhaiterai faire 100 tirages pour mes Z unités, et tant qu'a faire que ce tirage soit stocké pour les Z unités (1 à 12)

    j'espère m'être fait comprendre, je peux tenter de mieux m'expliquer si ce n'est pas le cas ...

    En vous remerciant
    Geoffroy

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    J'ai pas bien compris ce que tu veux et où tu bloques.
    Ça pourrait être pas mal que tu mettre un exemple de sortie que tu voudrais, au moins on comprendrait où tu veux aller.

    Pour faire des tirages successif il suffit d'utiliser des boucles (for ou *apply).
    Représenter tes données sous la forme d'une matrice ou d'un by pourrait aussi simplifier un peu.

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

    Informations professionnelles :
    Activité : Étudiant

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

    J'ai testé les apply (à priori à privilégier par rapport aux for), mais le résultat final n'est pas atteint comme je le souhaiterai.

    Pour le moment j'obtiens ceci :
    (pour les pixels, à savoir que chaque unité est prise (12 au total) et que 2 à 25 pixels sont tirés dans chacune des unités)

    Nom : Rplot01.jpeg
Affichages : 553
Taille : 37,8 Ko

    Maintenant, je souhaiterai obtenir la même chose ( 2 à 25 pixels tirés) mais en fonction du nombre d'unités tiré également.
    J'aurai donc pour une unité et 2 à 25 pixels, un graphe, pareil pour 2 unités... (plus j'aurai d'unité, plus je serai précis mais je ne veux pas un parfaite précision pour autant, je cherche l'équilibre)

    Un exemple de ce que j'obtiens (pour 2 unités sélectionnées parmi 12)
    Nom : 2GU.jpg
Affichages : 495
Taille : 22,8 Ko

    Je cherche à automatiser cela et le répéter plusieurs fois pour que ça soit statistiquement valable (mon image précédent est réalisé sur un seul tirage aléatoire, alors je peux tomber sur que des 0 et complètement sous-estimer... alors qu'en le répétant 100fois, je fais quelque chose de réellement aléatoire)

    Je cherche à :

    - Réussir ma "boucle" pour répéter 100 fois mon tirage (pour 1 unité, pour 2, pour 3...) et stocker l'information afin d'appliquer la suite du code (si j'ai X unités, et 2-25pixels, j'obtiens tel graphe, etc.)

    - Obtenir 1 graphe pour chaque tirage d'unité (1Unité/2-25pixels ; 2Unités/2-25pixels ...), mais ça risque de me faire beaucoup de graphe au final
    --> Mes graphes pour chacune de mes unités + chacun des pixels pourrait être réunis comme tel :
    Nom : Test.jpg
Affichages : 501
Taille : 14,0 Ko
    (J'aurai un aperçu de l'intervalle d'estimation suivant le nombre d'unité fonction du nombre de pixels tirés. (exemple avec le premier graphe qui montre 12 unités tirées, j'ai des valeurs de 165 à 180) et par la suite je pourrai donc dire que tant d'unités sélectionnées répondent à ce que je cherche.

    - Obtenir 1 graphe regroupant chaque résultat ( 1 à 12 unités et 2-25pixels) mais je ne sais pas si c'est possible ??



    J'espère avoir été un peu plus clair cette fois.


    Ps: je bosse en data frame, au départ j'étais sous forme de matrice, mais c'était compliqué pour traiter mes données. C'était plus facile pour moi (et les données sont de cette forme) de les traiter en dataframe

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/11/2010, 13h10
  2. Ordre selon tirage aléatoire
    Par Arrow_V dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/01/2009, 10h09
  3. Prise en compte des virgules aléatoire selon le type de curseur ?
    Par mosquitout dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 25/07/2006, 19h48
  4. Réponses: 2
    Dernier message: 16/05/2006, 17h02
  5. Eviter deux nombres identiques dans un tirage aléatoire
    Par moon tiger dans le forum Pascal
    Réponses: 5
    Dernier message: 25/11/2002, 09h57

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