Je produis un script pour créer des échantillons de bootstrap à partir de l' cats
ensemble de données (à partir du -MASS-
package).
En suivant le manuel de Davidson et Hinkley [1], j'ai effectué une régression linéaire simple et adopté une procédure fondamentale non paramétrique pour le bootstrap à partir des observations iid, à savoir le rééchantillonnage des paires .
L'échantillon d'origine se présente sous la forme:
Bwt Hwt
2.0 7.0
2.1 7.2
...
1.9 6.8
Grâce à un modèle linéaire univarié, nous voulons expliquer le poids du foyer du chat à travers le poids de son cerveau.
Le code est:
library(MASS)
library(boot)
##################
# CATS MODEL #
##################
cats.lm <- glm(Hwt ~ Bwt, data=cats)
cats.diag <- glm.diag.plots(cats.lm, ret=T)
#######################
# CASE resampling #
#######################
cats.fit <- function(data) coef(glm(data$Hwt ~ data$Bwt))
statistic.coef <- function(data, i) cats.fit(data[i,])
bootl <- boot(data=cats, statistic=statistic.coef, R=999)
Supposons maintenant qu'il existe une variable de regroupement cluster = 1, 2,..., 24
(par exemple, chaque chat appartient à une portée donnée). Pour simplifier, supposons que les données soient équilibrées: nous avons 6 observations pour chaque cluster. Ainsi, chacune des 24 portées est composée de 6 chats (ie n_cluster = 6
et n = 144
).
Il est possible de créer une fausse cluster
variable via:
q <- rep(1:24, times=6)
cluster <- sample(q)
c.data <- cbind(cats, cluster)
J'ai deux questions connexes:
Comment simuler des échantillons conformément à la structure (groupée) de l'ensemble de données? Autrement dit, comment rééchantillonner au niveau du cluster? Je voudrais échantillonner les grappes avec remplacement et définir les observations dans chaque grappe sélectionnée comme dans le jeu de données d'origine (c'est-à-dire échantillonner avec remplacement des grappes et sans remplacer les observations dans chaque grappe).
C'est la stratégie proposée par Davidson (p. 100). Supposons que nous prélevions des B = 100
échantillons. Chacun d'eux devrait être composé de 24 grappes éventuellement récurrentes (par exemple cluster = 3, 3, 1, 4, 12, 11, 12, 5, 6, 8, 17, 19, 10, 9, 7, 7, 16, 18, 24, 23, 11, 15, 20, 1
), et chaque grappe devrait contenir les mêmes 6 observations de l'ensemble de données d'origine. Comment faire ça en R
? (avec ou sans le -boot-
paquet.) Avez-vous d'autres suggestions pour continuer?
La deuxième question concerne le modèle de régression initial. Supposons que j'adopte un modèle à effets fixes , avec des interceptions au niveau du cluster. Modifie-t-il la procédure de rééchantillonnage adoptée?
[1] Davidson, AC, Hinkley, DV (1997). Méthodes d'amorçage et leurs applications . La presse de l'Universite de Cambridge.
la source
J'ai essayé de résoudre le problème moi-même et j'ai produit le code suivant.
Bien que cela fonctionne, il pourrait probablement être amélioré en termes de vitesse. Aussi, si possible, j'aurais préféré trouver un moyen d'utiliser le
-boot-
package, car il permet de calculer automatiquement un certain nombre d'intervalles de confiance bootstrap à traversboot.ci
...Par souci de simplicité, l'ensemble de données de départ se compose de 18 chats (les observations de «niveau inférieur») imbriqués dans 6 laboratoires (la variable de regroupement). L'ensemble de données est équilibré (
n_cluster = 3
pour chaque cluster). Nous avons un régresseurx
, pour expliquery
.Le faux ensemble de données et la matrice où stocker les résultats sont:
À chacune des
B
itérations, la boucle suivante échantillonne 6 grappes avec remplacement, chacune composée de 3 chats échantillonnés sans remplacement (c'est-à-dire que la composition interne des grappes est maintenue inchangée). Les estimations du coefficient du régresseur et de son erreur standard sont stockées dans la matrice précédemment créée:J'espère que cela vous aide, Lando
la source
replicate
; en prime, il renvoie automatiquement leb.sample
tableau pour vous. De plus, avec toutes les fusions ici, il est presque certainement préférable d'utiliserdata.table
et de rééchantillonnerkey
. Je peux apporter une réponse lorsque j'arrive à un ordinateur ... Question: pourquoi suivez-vous les erreurs types des coefficients?quantile(b.sample[,2], c(.025, .975))
Voici une manière beaucoup plus simple (et presque sans doute plus rapide) de faire le bootstrap en utilisant
data.table
(sur les données de @ lando.carlissian):la source
J'ai dû le faire récemment et utilisé
dplyr
. La solution n'est pas aussi élégante qu'avecdata.table
, mais:Le
inner_join
répète chaque ligne ayant une valeur donnéex
decluster
par le nombre de fois quix
apparaît danscluster_sample
.la source
Salut une solution très simple basée sur split et lapply, pas besoin de package spécifique sauf "boot", exemple avec une estimation de ICC basée sur la procédure nagakawa:
TROISIÈME: exécution du bootstrap
la source