Dois-je bootstrap au niveau du cluster ou au niveau individuel?

10

J'ai un modèle de survie avec des patients nichés dans des hôpitaux qui inclut un effet aléatoire pour les hôpitaux. L'effet aléatoire est distribué gamma, et j'essaie de rapporter la «pertinence» de ce terme sur une échelle facilement compréhensible.

J'ai trouvé les références suivantes qui utilisent le rapport de risque médian (un peu comme le rapport de cotes médian), et calculé cela.

Bengtsson T, Dribe M: méthodes historiques 43:15, 2010

Cependant, je souhaite maintenant signaler l'incertitude associée à cette estimation à l'aide du bootstrap. Les données sont des données de survie, et donc il y a plusieurs observations par patient et plusieurs patients par hôpital. Il semble évident que je dois regrouper les observations des patients lors du rééchantillonnage. Mais je ne sais pas si je dois aussi regrouper les hôpitaux (c.-à-d. Rééchantillonner les hôpitaux plutôt que les patients?

Je me demande si la réponse dépend du paramètre d'intérêt, et serait donc différente si la cible était quelque chose qui était pertinent au niveau du patient plutôt qu'au niveau de l'hôpital?

J'ai répertorié le code stata ci-dessous au cas où cela aiderait.

cap program drop est_mhr
program define est_mhr, rclass
stcox patient_var1 patient_var2 ///
    , shared(hospital) ///
    noshow
local twoinvtheta2 = 2 / (e(theta)^2)
local mhr = exp(sqrt(2*e(theta))*invF(`twoinvtheta2',`twoinvtheta2',0.75))
return scalar mhr = `mhr'
end

bootstrap r(mhr), reps(50) cluster(hospital): est_mhr
drstevok
la source

Réponses:

2

Imaginez que vous ayez mené une étude sur les résultats scolaires des enfants. Vous avez pris un échantillon aléatoire d'écoles d'une région et de chaque école une classe a été incluse dans l'étude. Vous avez effectué une analyse et souhaitez maintenant utiliser le bootstrap pour obtenir des intervalles de confiance pour vos estimations. Comment faire?

Tout d'abord, notez que vos données sont hiérarchiques, elles ont plusieurs niveaux: écoles, classes au sein des écoles et élèves au sein des classes. Puisqu'il n'y a qu'une seule classe par école, le deuxième niveau est donc inexistant dans vos données. Nous pouvons supposer qu'il existe des similitudes au sein des écoles et des différences entre les écoles. S'il existe des similitudes au sein des écoles, si vous échantillonnez des élèves au hasard, sans tenir compte de leur appartenance à l'école, vous pouvez éventuellement détruire la structure hiérarchique de vos données.

En général, il existe plusieurs options:

  1. exemples d'élèves avec remplacement,
  2. échantillonner des écoles entières avec remplacement,
  3. échantillonner d'abord les écoles avec remplacement, puis échantillonner les élèves (a) avec remplacement, ou (b) sans remplacement.

Il semble que la première approche soit la pire. Rappelez-vous que l' échantillonnage bootstrap devrait en quelque sorte imiter le processus d'échantillonnage dans votre étude et que vous échantillonniez des écoles plutôt que des élèves individuels. Choisir entre (2) et (3) est plus compliqué, mais j'espère que vous trouverez des articles de recherche sur ce sujet (par exemple Rena et al. 2010, Field et Welsh, 2007). En général, les options (2) ou (3b) sont préférables car il semble que l'inclusion d'un trop grand nombre d'échantillons avec remplacement entraîne des résultats biaisés. Vous pouvez trouver plus d'informations sur ce sujet également dans les livres d'Efron et Tibshirani (1994) et Davison et Hinkley (1997). Notez que nous avons un problème similaire avec le démarrage des données de séries chronologiqueset dans ce cas, nous échantillonnons également des blocs entiers de séries (par exemple, toute la saison si nous supposons une saisonnalité) plutôt que des observations individuelles car sinon la structure temporelle serait détruite. En pratique, il n'y a pas de solution unique, mais avec des structures de données complexes, vous devez choisir un schéma d'échantillonnage bootstrap qui correspond le mieux à vos données et à votre problème et, si possible, utiliser une étude de simulation pour comparer différentes solutions.


Davison, AC et Hinkley, DV (1997). Méthodes d'amorçage et leur application. Cambridge.

Efron, B. et Tibshirani, RJ (1994). Une introduction au Bootstrap . CRC Press.

Ren, S., Lai, H., Tong, W., Aminzadeh, M., Hou, X., et Lai, S. (2010). Amorçage non paramétrique pour les données hiérarchiques. Journal of Applied Statistics, 37 (9), 1487-1498.

Field, CA et Welsh, AH (2007). Bootstrapping des données en cluster. Journal de la Royal Statistical Society: série B (méthodologie statistique), 69 (3), 369-390.

Tim
la source
1
Accepté votre réponse (merci), mais pour d'autres, j'ai maintenant implémenté une fonction dans R pour le faire dans ma réponse
drstevok
3

La réponse semble être que le processus de rééchantillonnage doit tenir compte de la structure des données. Il y a une belle explication ici (avec du code R pour l'implémenter).

http://biostat.mc.vanderbilt.edu/wiki/Main/HowToBootstrapCorrelatedData

Merci au pointeur du UCLA Statistical Consulting Group .

J'ai écrit une version plus rapide (mais moins flexible) de l'extrait de code lié à ci-dessus - vérifiez ici les mises à jour et les détails.

rsample2 <- function(data=tdt, id.unit=id.u, id.cluster=id.c) {
require(data.table)

setkeyv(tdt,id.cluster)
# Generate within cluster ID (needed for the sample command)
tdt[, "id.within" := .SD[,.I], by=id.cluster, with=FALSE]

# Random sample of sites
bdt <- data.table(sample(unique(tdt[[id.cluster]]), replace=TRUE))
setnames(bdt,"V1",id.cluster)
setkeyv(bdt,id.cluster)

# Use random sample of sites to select from original data
# then
# within each site sample with replacement using the within site ID
bdt <- tdt[bdt, .SD[sample(.SD$id.within, replace=TRUE)],by=.EACHI]

# return data sampled with replacement respecting clusters
bdt[, id.within := NULL] # drop id.within
return(bdt)
}
drstevok
la source