2017-06-15 5 views
2

J'ai des données avec environ 25 groupes différents. Dans un effort pour voir comment la variance de chaque groupe changerait si j'avais des tailles d'échantillon différentes, j'essaie de faire un bootstraping stratifié. Par exemple, à la taille de l'échantillon 5, il devrait produire 1000 collections de 5 points rééchantillonnés pour chaque groupe. J'aime recueillir la plus petite taille d'échantillon possible dans la gamme possible de 5 à 30 par groupe. Le problème que je rencontre est que je dois sous-créer chaque groupe et lancer l'amorçage sur des groupes individuels, puis copier et dépasser la sortie R dans Excel. (Je suis assez vert à R et comment coder). Cela prend trop de temps. J'ai besoin d'automatiser le bootstrapping pour reconnaître les groupes et en quelque sorte enregistrer une statistique de la collection de 1000 groupes, à une base de données. Est-ce que ça a du sens?Bootstrapping stratifié en R avec> 25 strates

Voici ce code que j'ai jusqu'à présent: ....

#sample data 
set.seed(1234) 
df <- data.frame(g.name = as.factor(sample(c(LETTERS),100, replace = T)), 
      C.H = as.numeric(sample(c(1:9),100, replace=T))) 

#subset data by group... here only a three examples 
Agroup=subset(df,C.H=='A') 
Bgroup=subset(df,C.H=='B') 
Cgroup=subset(df,C.H=='C') 

#Bootstrap selecting a sample size of "i", "B" number of times. i.e. I am 
selecting sample sizes from 5 to 30, 1000 times each. I then apply var() to 
the sample, and take the multiple variances(or the variance of the 
variances). C.H is the measurement ranging from 1 to 9. 

B=1000 
cult.var=(NULL) 
for (i in 5:30){ 
boot.samples=matrix(sample(Agroup$C.H,size=B*i, 
replace=TRUE),B,i) 
    cult.var[i]=var(apply(boot.samples,1,var)) 
} 
print(cult.var) 

Cela fonctionne, mais il y a beaucoup de copier et coller. Je pense que je dois utiliser soit une boucle for pour faire le bootstrap par groupe, soit trouver autre chose. J'ai trouvé un moyen de faire un échantillonnage stratifié tout seul sans amorçage. Alors peut-être que je pourrais comprendre comment répéter que 1000 fois en quelque sorte ...

Le example here en utilisant la fonction boot() ne correspond pas à ma situation. J'ai joué avec un peu en vain. Je ne suis pas sûr de savoir comment écrire des fonctions qui peuvent aussi être pourquoi je ne peux pas le comprendre.

Répondre

1

est ici un coup de poignard à elle ...

# generating data 
set.seed(1234) 
df <- data.frame(g.name = as.factor(sample(c(LETTERS),100, replace = T)), 
       C.H = as.numeric(sample(c(1:9),100, replace=T))) 

boot.samples <- with(df, tapply(C.H, g.name, function(x) lapply(5:30, function(i) replicate(1000, sample(x,size=i,replace=T))))) 

str(boot.samples$A) 
## List of 26 
## $ : num [1:5, 1:1000] 7 7 3 7 7 7 3 3 2 7 ... 
## $ : num [1:6, 1:1000] 7 2 2 2 3 7 7 2 2 7 ... 
## $ : num [1:7, 1:1000] 2 3 2 7 2 3 7 2 3 3 ... 
## $ : num [1:8, 1:1000] 7 7 3 3 3 7 2 7 7 3 ... 
## $ : num [1:9, 1:1000] 2 2 2 7 2 7 3 3 3 7 ... 
## ...and so on 

variances <- lapply(boot.samples, function(y) sapply(y, function(x) apply(x, 2, var))) 
    str(variances) 
## List of 26 
## $ A: num [1:1000, 1:26] 3.2 5.8 6.2 3.2 0.3 4.8 5 5.8 6.7 3.2 ... 
## $ B: num [1:1000, 1:26] 3.2 0.8 4.7 5.3 5.3 5.3 1.2 4.7 4.2 3.8 ... 
## $ C: num [1:1000, 1:26] 9 4.8 2.7 9.8 8.3 9.8 10.2 10.2 9 12.3 ... 
## $ D: num [1:1000, 1:26] 8.3 7.5 9.8 3.8 3.5 3.5 5.7 3.7 6.7 3.2 ... 
## ...and so on 

variancesvariances <- lapply(variances, function(x) apply(x, 2, var)) 
str(variancesvariances) 
## List of 26 
## $ A: num [1:26] 3.15 2.27 1.53 1.3 1.03 ... 
## $ B: num [1:26] 4.32 3.54 2.83 2.46 2.09 ... 
## $ C: num [1:26] 13.06 10.08 8.46 6.98 5.59 ... 
## $ D: num [1:26] 4.9 3.7 3.02 2.39 2.07 ... 
## ...and so on 

semble aller vers le bas avec la taille de l'échantillon comme annoncé ... nous allons faire une jolie photo

cols <- rainbow(26) 
plot(NA, xlim=c(1,26), ylim=c(0,max(unlist(variancesvariances)))) 
for(i in 1:26) { 
    lines(variancesvariances[[i]], col=cols[i]) 
    text(1,variancesvariances[[i]][1],names(variancesvariances)[i],col=cols[i]) 
} 

Notez que cela peut être converti à un data.frame avec as.data.frame(variancesvariances).

Est-ce que je l'ai eu cette fois?

+0

Quelle est votre fonction (x)? C'est un pas dans la bonne direction. – andemexoax

+0

Quelle est votre 'fonction (x)'? Je ne pense pas que cela prenne des échantillons de cinq mille fois. Je pense que tout ce que votre code fait est de prendre 1000 échantillons pour chaque "strate", ce qui est bien, mais j'ai besoin de prendre des échantillons de cinq fois 1000, puis six fois 1000 fois jusqu'à trente. À mesure que la taille de l'échantillon augmente, la variance des variances (votre 'spply()') devrait diminuer. – andemexoax

+0

caca, j'ai lu votre question trop vite. Edit à paraître, j'espère. –