2016-05-08 9 views
1

mit dieser meine Dummy-Daten ist:Wie Daten von Clustern (Block Sampling) mit Ersatz in R Resampling Sampling Paket

income <- as.data.frame.vector <- sample(1000:10000, 1000, replace=TRUE) 
individuals <- as.data.frame.vector <- sample(1:50,1000,replace=TRUE) 
datatest <- as.data.frame (cbind (income, individuals)) 

Ich weiß, dass ich von den einzelnen Zeilen mit diesem Code probieren kann:

sample <- datatest[sample(nrow(datatest), replace=TRUE),] 

Nun möchte ich Stichproben mit Ersatz und gleichen Wahrscheinlichkeiten des Datensatzes extrahieren, aber komplette Blöcke von Beobachtungen mit dem gleichen individuellen Code probieren. Beachten Sie, dass es 50 Personen gibt, aber 1000 Beobachtungen. Einige Beobachtungen gehören demselben Individuum an, daher möchte ich nach Individuen (in diesem Fall Cluster) und nicht nach Beobachtungen suchen. Es macht mir nichts aus, wenn die extrahierten Proben sich geringfügig in der Anzahl der Beobachtungen unterscheiden. Wie kann ich das machen?

Ich habe versucht:

library(sampling) 
samplecluster <- cluster (datatest, clustername=c("individuals"), size=50, 
          method="srswr") 

Aber das Ergebnis ist nicht die abgetasteten Daten. Fehle ich etwas?

+0

Mögliches Duplikat hilfreich sein [Randomly ausgewählter Gruppen (und alle Fälle pro Gruppe) in R?] (Http://stackoverflow.com/questions/13214769/randomly-select- Gruppen-und-alle-Fälle-pro-Gruppe-in-r) – Bulat

+0

Gerade realisierte, dass dies ein sehr häufiges Problem sein muss, fand eine sehr ähnliche Frage. – Bulat

+0

Ja, Sie haben Recht, es ist das gleiche Problem. Ich werde die Frage jedoch hinterlassen, falls jemand sie mit diesen Bedingungen durchsucht. Neben Ihrer Antwort und den Antworten auf die andere Frage stelle ich Ihnen im Folgenden eine alternative Antwort unter Verwendung des Sampling-Pakets zur Verfügung. –

Antwort

2

Ich bin mir nicht sicher, ob mir etwas fehlt. Wenn Sie nur einige Ihrer Individuen wollen, können Sie eine kleinere Stichprobe von ihnen schaffen:

ind.sample <- sample(1:50, size = 10) 
print(ind.sample) 
# [1] 17 43 38 39 28 23 35 47 9 13 
my.sample <- datatest[datatest$individuals %in% ind.sample) ,] 
head(my.sample) 
# income individuals 
#21 9072   17 
#97 5928   35 
#122 9130   43 
#252 4388   43 
#285 8083   28 
#287 1065   35 

ich eine allgemeinere Ansatz erraten wäre zufällige Indizes zu erzeugen;

ind.unique <- unique(individuals) 
ind.sample.index <- sample(1:length(ind.unique), size = 10) 
ind.sample <- ind.unique[ind.sample.index] 
print(ind.sample[order(ind.sample)]) 
my.sample <- datatest[datatest$individuals %in% ind.sample, ] 
ind.counts <- aggregate(income ~ individuals, my.sample, FUN = length) 
print(ind.counts) 
+1

Das macht tatsächlich auch den Trick. Vielen Dank! –

2

Nun, es scheint, dass ich tatsächlich etwas vermisst habe. Nach dem Befehl cluster müssen Sie den Befehl getdata (alle aus dem Sampling-Paket) anwenden. Auf diese Weise bekomme ich die Probe, wie ich wollte, plus ein paar zusätzliche Spalten.

samplecluster <- cluster (datatest, clustername=c("personid"), size=50, method="srswr") 

Geben Sie:

head(samplecluster) 

individuals ID_unit Replicates Prob 
1  1  259   2 0.63583 
2  1  178   2 0.63583 
3  1  110   2 0.63583 
4  1  153   2 0.63583 
5  1  941   2 0.63583 
6  1  667   2 0.63583 

Dann getdata mit, habe ich auch die ursprünglichen Daten über Einkommen von ganzem Cluster abgetastet bekommen:

datasample <- getdata (datatest, samplecluster) 

head(datasample) 
    income individuals ID_unit Replicates Prob 
1 8567  1  259   2 0.63583 
2 2701  1  178   2 0.63583 
3 4998  1  110   2 0.63583 
4 3556  1  153   2 0.63583 
5 2893  1  941   2 0.63583 
6 7581  1  667   2 0.63583 
+0

Auch ich fand hier einen anderen direkten Weg, dies zu tun: http://stackoverflow.com/questions/13214769/randomly-select-groups-and-all-cases-per-group-in-r –

1

Ich denke, es ist wichtig, dass die Datenmenge beachten muss noch erweitert werden, um alle Replikate einzuschließen.

sw<-data.frame(datasample[rep(seq_len(dim(datasample)[1]), datasample$Replicates),, drop = FALSE], row.names=NULL) 

Könnte jemand