Calcolo delle dimensioni del campione per la regressione logistica univariata


11

Come si calcola la dimensione del campione necessaria per uno studio in cui una coorte di soggetti avrà una singola variabile continua misurata al momento di un intervento chirurgico e poi due anni dopo saranno classificati come risultato funzionale o risultato compromesso.

Vorremmo vedere se quella misurazione avrebbe potuto prevedere il risultato negativo. Ad un certo punto potremmo voler ricavare un punto di taglio nella variabile continua sopra la quale proveremmo ad intervenire per diminuire la probabilità del risultato compromesso.

Qualche idea? Qualsiasi implementazione R.


Ti aspetti alcuni abbandoni durante il follow-up? Ci sono altre covariate da includere nel tuo modello?
chl

Fammi succhiare un tasso di abbandono dal pollice - 20%. Raccoglieremo molte variabili, ad esempio, età, punteggio del trauma, ma volevo mantenere le cose il più semplici possibile per il calcolo della potenza. Ho trovato spesso utile discutere di un modello primario e poi di modelli secondari che sono caricati con più finezza e sfumatura.
Farrel,

Ok, ma di solito il dropout% previsto, il numero di covariate e se le covariate sono misurate con errori (vedi ad es. J.mp/9fJkhb ) inserisci la formula (in ogni caso, aumenterà la dimensione del campione).
chl

Risposte:


7

I calcoli delle dimensioni del campione per la regressione logistica sono complessi. Non tenterò di sintetizzarlo qui. Soluzioni ragionevolmente accessibili a questo problema si trovano in:

Hsieh FY. Tabelle delle dimensioni di esempio per la regressione logistica. Statistica in medicina. 1989 lug; 8 (7): 795-802.

Hsieh FY, et al. Un semplice metodo di calcolo della dimensione del campione per la regressione lineare e logistica. Statistica in medicina. 30 luglio 1998; 17 (14): 1623-34.

Una discussione accessibile sui problemi con calcoli di esempio è disponibile nell'ultimo capitolo (Sezione 8.5 pp 339-347) della regressione logistica applicata di Hosmer & Lemeshow .


7

Di solito trovo più facile e veloce eseguire una simulazione. I documenti richiedono molto tempo per leggere, comprendere e infine giungere alla conclusione che non si applicano nel caso speciale a cui si è interessati.

Pertanto, sceglierei solo un certo numero di argomenti, simulerei la covariata a cui sei interessato (distribuito come credi che sarà), simulerei risultati positivi / negativi in ​​base alla forma funzionale che ritieni (effetti soglia della covariata? Non linearità?) con la dimensione minima (clinicamente) significativa dell'effetto che vorresti rilevare, esegui il risultato attraverso l'analisi e vedi se l'effetto si trova nella tua alfa. Riesegui 10.000 volte e controlla se hai trovato l'effetto nell'80% delle simulazioni (o in qualsiasi altra potenza di cui hai bisogno). Regola il numero di soggetti, ripeti finché non hai un potere di cui sei soddisfatto.

Questo ha il vantaggio di essere molto generale, quindi non sei limitato a una forma funzionale specifica o a un numero o distribuzione specifici di covariate. Puoi includere abbandoni, vedi il commento di chl sopra, a caso o influenzato dalla covariata o dal risultato. Fondamentalmente codifichi in anticipo l'analisi che farai sul campione finale, che a volte aiuta a focalizzare il mio pensiero sul progetto dello studio. Ed è facilmente eseguibile in R (vettorializzare!).


Hai un caso funzionante in R?
Farrel,

1
@Farrel: ecco uno script molto breve, che assume [0,1] covariate distribuite uniformemente, un OR di 2 tra il primo e il terzo quartile della covariata e rumore normale standard, che porta al potere .34 per n = 100. Ci proverei con questo per vedere quanto tutto sia sensibile ai miei presupposti: corre <- 1000; nn <- 100; set.seed (2010); rilevamenti <- replicate (n = run, expr = {covariate <- runif (nn); outcome <- runif (nn) <1 / (1 + exp (-2 * log (2) * covariate + rnorm (nn)) ); riepilogo (glm (outcome ~ covariate, family = "binomial")) $ coefficients ["covariate", "Pr (> | z |)"] <.05}) cat ("Power:", sum (detections) / run, "\ n")
Stephan Kolassa,

1
Puoi allegare il tuo codice come pastie ( pastebin.com ) o Gist ( gist.github.com ) se ritieni che sia più conveniente e ricollegarlo al tuo commento.
chl

@chl: +1, grazie mille! Ecco l'essenza: gist.github.com/607968
Stephan Kolassa,

Ottimo codice ma c'è un problema. Non sono intelligente come te. Ne ho bisogno suddiviso per gradi. Presumo sia corre il numero di simulazioni? Che cos'è nn? È il numero di soggetti nello studio? Poi vedo che hai creato una distribuzione di covariate e le hai fatte determinare un sì o un no a seconda di una soglia.
Farrel,

4

In seguito al post di Stephan Kolassa (non posso aggiungerlo come commento), ho un codice alternativo per una simulazione. Questo utilizza la stessa struttura di base, ma viene esploso un po 'di più, quindi forse è un po' più facile da leggere. Si basa anche sul codice di Kleinman e Horton per simulare la regressione logistica.

nn è il numero nel campione. La covariata dovrebbe essere continuamente distribuita normalmente e standardizzata per significare 0 e sd 1. Usiamo rnorm (nn) per generare questo. Selezioniamo un odds ratio e lo memorizziamo in odds.ratio. Scegliamo anche un numero per l'intercettazione. La scelta di questo numero regola la percentuale dell'esperienza del campione "evento" (ad es. 0,1, 0,4, 0,5). Devi giocare con questo numero finché non ottieni la giusta proporzione. Il codice seguente fornisce una proporzione di 0,1 con una dimensione del campione di 950 e un OR di 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)

il sommario (proporzione) conferma che la proporzione è ~ 0,1

Quindi utilizzando le stesse variabili, la potenza viene calcolata su 10000 corse:

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)

Penso che questo codice sia corretto: l'ho verificato rispetto agli esempi forniti in Hsieh, 1998 (tabella 2), e sembra concordare con i tre esempi forniti. L'ho anche provato con l'esempio a p 342 - 343 di Hosmer e Lemeshow, dove ha trovato una potenza di 0,75 (rispetto allo 0,8 di Hosmer e Lemeshow). Quindi può darsi che in alcune circostanze questo approccio sottovaluti il ​​potere. Tuttavia, quando ho eseguito lo stesso esempio in questo calcolatore online , ho scoperto che è d'accordo con me e non il risultato in Hosmer e Lemeshow.

Se qualcuno può dirci perché è così, sarei interessato a saperlo.


Ho 2 domande se non ti dispiace.1) La funzione proporzione è semplicemente quella di ottenere l'intercetta corretta? 2) qual è la logica dietro l'utilizzo di ytest (confrontando prob con un uni draw casuale)?
B_Miner

@B_Miner 1) Al contrario - per ottenere la proporzione corretta, devi impostare l'intercetta correttamente - quindi regola l'intercetta fino a ottenere la proporzione che ti aspetti. 2) La logica di ytest è che dobbiamo ottenere un esito dicotomico 0 o 1. Quindi, confrontiamo ogni campione dalla distribuzione uniforme alla probabilità (prob) per ottenere il nostro esito dicotomico. Il 'runis' non deve essere estratto dalla distribuzione uniforme casuale - un binomio o altra distribuzione può avere più senso per i tuoi dati. Spero che questo aiuti (scusate il ritardo nella risposta).
Andrew

3

θ=10:θ=0

in realtà, sembra che il tuo studio sarà condotto in modo sequenziale. in tal caso, potrebbe essere necessario renderlo parte esplicita dell'esperimento. il campionamento sequenziale può spesso essere più efficiente di un esperimento di dimensioni del campione fisse [in media sono necessarie meno osservazioni].

farrel: lo sto aggiungendo in risposta al tuo commento.

per ottenere una dimensione del campione, di solito si specifica una sorta di criterio di precisione per una stima [come la lunghezza di un CI] O la potenza a una specifica alternativa di un test da eseguire sui dati. sembra che tu abbia menzionato entrambi questi criteri. non c'è nulla di sbagliato in questo, in linea di principio: devi solo fare due calcoli della dimensione del campione - uno per ottenere la precisione di stima desiderata - e un altro per ottenere la potenza desiderata all'alternativa dichiarata. allora la più grande delle due dimensioni del campione è ciò che è richiesto. [a proposito - oltre a dire l'80% di potenza - non sembra che tu abbia menzionato quale test hai intenzione di eseguire - o l'alternativa a cui vuoi l'80% di potenza.]

per quanto riguarda l'utilizzo dell'analisi sequenziale: se i soggetti sono arruolati nello studio tutti contemporaneamente, ha senso una dimensione del campione fissa. ma se i soggetti sono pochi e distanti tra loro, potrebbero essere necessari un anno o due [o più] per ottenere il numero richiesto. quindi il processo potrebbe durare per tre o quattro anni [o più]. in tal caso, uno schema sequenziale offre la possibilità di fermarsi prima di questo - se l'effetto che stai cercando diventa statisticamente significativo all'inizio del processo.


I criteri saranno una differenza del 10% nella probabilità di esito positivo o negativo. O diciamo dal momento che sarà una regressione logistica, odds ratio = 2. alpha = 0,05, power = 80%, non so ancora quale sia la varianza aggregata sulla variabile continua ma supponiamo che la deviazione standard sia 7mmHg. L'analisi sequenziale sarebbe buona, ma il risultato finale è di due anni dall'esecuzione della misurazione.
Farrel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.