2010-07-28 9 views
1

Considérez le code suivant:me aider à améliorer mon bootstrap

require(Hmisc) 
num.boots <- 10 
data <- rchisq(500, df = 5) #generate fake data 

#create bins 
binx <- cut(data, breaks = 10) 
binx <- levels(binx) 
binx <- sub("^.*\\,", "", binx) 
binx <- as.numeric(substr(binx, 1, nchar(binx) - 1)) 

#pre-allocate a matrix to be filled with samples 
output <- matrix(NA, nrow = num.boots, ncol = length(binx)) 

#do random sampling from the vector and calculate percent 
# of values equal or smaller to the bin number (i) 
for (i in 1:num.boots) { 
    walk.pair.sample <- sample(data, size = length(data), replace = TRUE) 
    data.cut <- cut2(x = walk.pair.sample, cuts = binx) 
    data.cut <- table(data.cut)/sum(table(data.cut)) 
    output[i, ] <- data.cut 
} 

#do some plotting 
plot(1:10, seq(0, max(output), length.out = nrow(output)), type = "n", xlab = "", ylab = "") 

for (i in 1:nrow(output)) { 
    lines(1:10, output[i, 1:nrow(output)]) 
} 

#mean values by columns 
output.mean <- apply(output, 2, mean) 
lines(output.mean, col="red", lwd = 3) 
legend(x = 8, y = 0.25, legend = "mean", col = "red", lty = "solid", lwd = 3) 

Je me demandais si je peux fournir la chaussure: démarrage() fonctionner une fonction qui a pour sa sortie un vecteur de longueur n> 1? Est-ce possible?

Voici mes faibles tentatives, mais je dois faire quelque chose de mal.

require(boot) 
bootstrapDistances <- function(data, binx) { 
    data.cut <- cut2(x = data, cuts = binx) 
    data.cut <- table(data.cut)/sum(table(data.cut)) 
    return(data.cut) 
} 

> x <- boot(data = data, statistic = bootstrapDistances, R = 100) 
Error in cut.default(x, k2) : 'breaks' are not unique 

Je ne comprends pas vraiment pourquoi Hmisc::cut2() ne fonctionne pas correctement dans le boot() appel, mais fonctionne quand je l'appelle dans une boucle for() (voir code ci-dessus). La logique de ma fonction bootstrapDistances() est-elle réalisable avec boot()? Des pointeurs très appréciés.

.: EDIT :.

Aniko a suggéré que je modifie ma fonction de manière à inclure un index. Lors de la lecture de la documentation de boot(), cela n'a pas été clair pour moi, ce qui explique pourquoi la fonction ne fonctionne peut-être pas. Voici la nouvelle fonction Aniko suggéré:

bootstrapDistances2 <- function(data, idx, binx) { 
    data.cut <- cut2(x = data[idx], cuts = binx) 
    data.cut <- table(data.cut)/sum(table(data.cut)) 
    return(data.cut) 
} 

Cependant, je réussi à produire une erreur et je travaille encore comment l'enlever. Après avoir redémarré ma session R (j'ai également essayé une autre version, 2.10.1), cela semble fonctionner correctement.

Répondre

2

De l'aide-fichier pour la fonction boot:

In all other cases statistic must take at least two arguments. The first argument passed will always be the original data. The second will be a vector of indices, frequencies or weights which define the bootstrap sample.

Vous avez donc besoin d'ajouter un second paramètre à votre fonction bootstrapDistances qui lui dire quels éléments des données sont sélectionnées:

bootstrapDistances2 <- function(data, idx, binx) { 
    data.cut <- cut2(x = data[idx], cuts = binx) 
    data.cut <- table(data.cut)/sum(table(data.cut)) 
    return(data.cut) 
} 

Et les résultats:

x <- boot(data = data, statistic = bootstrapDistances2, R = 100, binx=binx) 
x 

ORDINARY NONPARAMETRIC BOOTSTRAP 


Call: 
boot(data = data, statistic = bootstrapDistances2, R = 100, binx = binx) 


Bootstrap Statistics : 
    original bias std. error 
t1*  0.208 0.00134 0.017342783 
t2*  0.322 0.00062 0.021700803 
t3*  0.190 -0.00034 0.018873433 
t4*  0.136 -0.00116 0.016206197 
t5*  0.078 -0.00120 0.011413265 
t6*  0.036 0.00070 0.008510837 
t7*  0.016 0.00074 0.005816417 
t8*  0.006 0.00024 0.003654581 
t9*  0.000 0.00000 0.000000000 
t10* 0.008 -0.00094 0.003368961 
+0

Bravo pour essayer, mais j'obtiens cette erreur: x <- boot (données = données, statistiques = bootstrapDistances2, R = 100, binx = binx) Erreur dans t.star [r,] <- statistique (données , i [r,], ...): nombre d'éléments à remplacer n'est pas un multiple de longueur de remplacement –

+0

Après avoir fait une nouvelle restauration de ma session R, les choses ont bien fonctionné. Pouah? Merci de votre collaboration. –

0

Bon une Swer, Aniko. En outre, la page d'aide de "boot" indique que la fonction statistique bootstrap peut renvoyer un vecteur, pas simplement un scalaire.

+0

Maintenant je le vois - il dit "statistique (s)"! –

Questions connexes