Calcul de la taille de l'échantillon pour la régression logistique univariée

11

Comment calcule-t-on la taille de l'échantillon nécessaire pour une étude dans laquelle une cohorte de sujets aura une seule variable continue mesurée au moment d'une intervention chirurgicale puis deux ans plus tard, ils seront classés comme résultat fonctionnel ou résultat altéré.

Nous aimerions voir si cette mesure aurait pu prédire le mauvais résultat. À un moment donné, nous pouvons vouloir dériver un point de coupure dans la variable continue au-dessus de laquelle nous tenterions d'intervenir pour diminuer la probabilité de l'issue altérée.

Des idées? Toute implémentation R.

Farrel
la source
Vous attendez-vous à des abandons lors du suivi? Y a-t-il d'autres covariables à inclure dans votre modèle?
chl
Permettez-moi de sucer un taux d'abandon de mon pouce - 20%. Nous allons en effet collecter de nombreuses variables par exemple, l'âge, le score de traumatisme mais je voulais garder les choses aussi simples que possible pour le calcul de la puissance. J'ai souvent trouvé utile de discuter d'un modèle primaire puis de modèles secondaires chargés avec plus de finesse et de nuances.
Farrel
Ok, mais généralement le pourcentage d'abandon attendu, le nombre de covariables et si les covariables sont mesurées avec des erreurs (voir par exemple j.mp/9fJkhb ) entrez la formule (dans tous les cas, cela augmentera la taille de l'échantillon).
chl

Réponses:

7

Les calculs de taille d'échantillon pour la régression logistique sont complexes. Je n'essaierai pas de le résumer ici. Des solutions raisonnablement accessibles à ce problème se trouvent dans:

Hsieh FY. Exemples de tableaux de tailles pour la régression logistique. Statistiques en médecine. 1989 juil; 8 (7): 795-802.

Hsieh FY et al. Une méthode simple de calcul de la taille de l'échantillon pour la régression linéaire et logistique. Statistiques en médecine. 30 juil.1998; 17 (14): 1623-34.

Une discussion accessible des problèmes avec des exemples de calculs peut être trouvée dans le dernier chapitre (Section 8.5 pp 339-347) de Hosmer & Lemeshow's Applied Logistic Regression .

Thylacoleo
la source
7

Je trouve généralement plus facile et plus rapide d'exécuter une simulation. Les articles mettent beaucoup de temps à lire, à comprendre et à conclure finalement qu'ils ne s'appliquent pas dans le cas particulier qui nous intéresse.

Par conséquent, je voudrais simplement choisir un certain nombre de sujets, simuler la covariable qui vous intéresse (distribuée comme vous le pensez), simuler de bons / mauvais résultats en fonction de la forme fonctionnelle que vous posez (effets de seuil de la covariable? Non-linéarité?) avec la taille d'effet minimale (cliniquement) significative que vous souhaitez détecter, exécutez le résultat à travers votre analyse et voyez si l'effet se trouve à votre alpha. Réexécutez cela 10 000 fois et regardez si vous avez trouvé l'effet dans 80% des simulations (ou quelle que soit la puissance dont vous avez besoin). Ajustez le nombre de sujets, répétez jusqu'à ce que vous ayez un pouvoir qui vous convient.

Cela a l'avantage d'être très général, donc vous n'êtes pas confiné à une forme fonctionnelle spécifique ou à un nombre ou une distribution spécifique de covariables. Vous pouvez inclure les abandons, voir le commentaire de chl ci-dessus, soit au hasard, soit influencé par la covariable ou le résultat. Vous codez essentiellement l'analyse que vous allez faire sur l'échantillon final au préalable, ce qui aide parfois à concentrer ma réflexion sur la conception de l'étude. Et cela se fait facilement en R (vectoriser!).

Stephan Kolassa
la source
Avez-vous un cas travaillé en R?
Farrel
1
@Farrel - voici un script très court, qui suppose des covariables uniformément réparties [0,1], un OU de 2 entre le premier et le troisième quartile de la covariable et du bruit normal standard, conduisant à une puissance de 0,34 pour n = 100. Je jouerais avec cela pour voir à quel point tout est sensible à mes hypothèses: exécute <- 1000; nn <- 100; set.seed (2010); détections <- répliquer (n = exécutions, expr = {covariable <- runif (nn); résultat <- runif (nn) <1 / (1 + exp (-2 * log (2) * covariable + rnorm (nn)) ); résumé (glm (result ~ covariate, family = "binomial")) $ coefficients ["covariate", "Pr (> | z |)"] <.05}) cat ("Power:", sum (detections) / runs, "\ n")
Stephan Kolassa
1
Vous pouvez joindre votre code en tant que pastie ( pastebin.com ) ou Gist ( gist.github.com ) si vous le jugez plus pratique, et le renvoyer à celui-ci dans votre commentaire.
chl
@chl: +1, merci beaucoup! Voici l'essentiel: gist.github.com/607968
Stephan Kolassa
Excellent code mais il y a un problème. Je ne suis pas aussi intelligent que toi. J'ai besoin de le décomposer par étapes. Je suppose qu'il s'agit du nombre de simulations? Qu'est-ce que nn? Est-ce le nombre de sujets dans l'étude? Ensuite, je vois que vous avez créé une distribution de covariables et leur avez fait déterminer un oui ou un non en fonction d'un seuil.
Farrel
4

Dans le prolongement du post de Stephan Kolassa (je ne peux pas ajouter ceci en tant que commentaire), j'ai un code alternatif pour une simulation. Cela utilise la même structure de base, mais est un peu plus explosé, donc c'est peut-être un peu plus facile à lire. Il est également basé sur le code de Kleinman et Horton pour simuler la régression logistique.

nn est le nombre dans l'échantillon. La covariable doit être distribuée normalement en continu et normalisée pour signifier 0 et sd 1. Nous utilisons rnorm (nn) pour générer cela. Nous sélectionnons un rapport de cotes et le stockons dans odds.ratio. Nous choisissons également un numéro pour l'interception. Le choix de ce nombre détermine quelle proportion de l'échantillon a vécu "l'événement" (par exemple 0,1, 0,4, 0,5). Vous devez jouer avec ce nombre jusqu'à ce que vous obteniez la bonne proportion. Le code suivant vous donne une proportion de 0,1 avec une taille d'échantillon de 950 et un OR de 1,5:

nn <- 950
runs <- 10000
intercept <- log(9)
odds.ratio <- 1.5
beta <- log(odds.ratio)
proportion  <-  replicate(
              n = runs,
              expr = {
                  xtest <- rnorm(nn)
                  linpred <- intercept + (xtest * beta)
                  prob <- exp(linpred)/(1 + exp(linpred))
                  runis <- runif(length(xtest),0,1)
                  ytest <- ifelse(runis < prob,1,0)
                  prop <- length(which(ytest <= 0.5))/length(ytest)
                  }
            )
summary(proportion)

le résumé (proportion) confirme que la proportion est ~ 0,1

Puis en utilisant les mêmes variables, la puissance est calculée sur 10000 runs:

result <-  replicate(
              n = runs,
              expr = {
                  xtest <- rnorm(nn)
                  linpred <- intercept + (xtest * beta)
                  prob <- exp(linpred)/(1 + exp(linpred))
                  runis <- runif(length(xtest),0,1)
                  ytest <- ifelse(runis < prob,1,0)
                  summary(model <- glm(ytest ~ xtest,  family = "binomial"))$coefficients[2,4] < .05
                  }
            )
print(sum(result)/runs)

Je pense que ce code est correct - je l'ai vérifié par rapport aux exemples donnés dans Hsieh, 1998 (tableau 2), et il semble être d'accord avec les trois exemples qui y sont donnés. Je l'ai également testé contre l'exemple des pages 342 à 343 de Hosmer et Lemeshow, où il a trouvé une puissance de 0,75 (contre 0,8 à Hosmer et Lemeshow). Il se peut donc que dans certaines circonstances, cette approche sous-estime le pouvoir. Cependant, lorsque j'ai exécuté le même exemple dans cette calculatrice en ligne , j'ai constaté qu'il était d'accord avec moi et non le résultat dans Hosmer et Lemeshow.

Si quelqu'un peut nous dire pourquoi c'est le cas, je serais intéressé de savoir.

Andrew
la source
J'ai 2 questions si cela ne vous dérange pas.1) La fonction de proportion est-elle simplement pour obtenir l'interception correcte? 2) quelle est la logique derrière l'utilisation de ytest (en comparant prob à un tirage unique aléatoire)?
B_Miner
@B_Miner 1) Dans l'autre sens - pour obtenir la bonne proportion, vous devez définir l'interception correctement - ajustez donc l'interception jusqu'à obtenir la proportion que vous attendez. 2) La logique de ytest est que nous devons obtenir un résultat dichotomique 0 ou 1. Nous comparons donc chaque échantillon de la distribution uniforme à la probabilité (prob) d'obtenir notre résultat dichotomique. Les `` runis '' ne doivent pas nécessairement être tirés de la distribution uniforme aléatoire - une distribution binomiale ou autre peut avoir plus de sens pour vos données. J'espère que cela vous aide (désolé pour le retard dans la réponse).
Andrew
3

θ=10:θ=0

en fait, il semble que votre étude sera menée de manière séquentielle. dans ce cas, il peut être avantageux d'en faire une partie explicite de l'expérience. l'échantillonnage séquentiel peut souvent être plus efficace qu'une expérience à taille d'échantillon fixe [moins d'observations nécessaires, en moyenne].

farrel: j'ajoute ceci en réponse à votre commentaire.

pour obtenir une taille d'échantillon, on spécifie généralement une sorte de critère de précision pour une estimation [telle que la longueur d'un CI] OU la puissance à une alternative spécifiée d'un test à effectuer sur les données. vous semblez avoir mentionné ces deux critères. il n'y a rien de mal à cela, en principe: il vous suffit ensuite de faire deux calculs de taille d'échantillon - un pour atteindre la précision d'estimation souhaitée - et un autre pour obtenir la puissance souhaitée à l'alternative indiquée. alors la plus grande des deux tailles d'échantillon est ce qui est requis. [btw - à part dire 80% de puissance - vous ne semblez pas avoir mentionné quel test vous prévoyez d'effectuer - ou l'alternative à laquelle vous voulez la puissance de 80%.]

quant à l'utilisation de l'analyse séquentielle: si les sujets sont tous inscrits à l'étude en même temps, alors une taille d'échantillon fixe est logique. mais si les sujets sont peu nombreux, il peut prendre un an ou deux [ou plus] pour obtenir le nombre requis inscrit. le procès pouvait donc durer trois ou quatre ans [ou plus]. dans ce cas, un schéma séquentiel offre la possibilité de s'arrêter plus tôt que cela - si le ou les effets que vous recherchez deviennent statistiquement significatifs plus tôt dans le procès.

ronaf
la source
Les critères seront une différence de 10% dans la probabilité d'un bon ou d'un mauvais résultat. Ou disons que ce sera une régression logistique, rapport de cotes = 2. alpha = 0,05, puissance = 80%, je ne sais pas encore quelle est la variance groupée sur la variable continue mais supposons que l'écart-type est de 7 mmHg. Une analyse séquentielle serait bonne mais le résultat final est de deux ans après la prise de mesure.
Farrel