Analisi di potenza per regressione logistica ordinale


Risposte:


27

Preferisco fare analisi di potenza oltre le basi mediante simulazione. Con i pacchetti precannati, non sono mai abbastanza sicuro di quali ipotesi vengano fatte.

Simulare per il potere è abbastanza semplice (e conveniente) usando R.

  1. decidi come pensi che debbano apparire i tuoi dati e come li analizzerai
  2. scrivere una funzione o un insieme di espressioni che simuleranno i dati per una data relazione e dimensione del campione ed eseguirà l'analisi (una funzione è preferibile in quanto è possibile trasformare la dimensione del campione e i parametri in argomenti per rendere più semplice provare valori diversi). La funzione o il codice dovrebbe restituire il valore p o altre statistiche di test.
  3. utilizzare la replicatefunzione per eseguire il codice dall'alto un sacco di volte (di solito inizio circa 100 volte per avere un'idea di quanto tempo impiega e per ottenere l'area generale corretta, quindi fino a 1.000 e talvolta 10.000 o 100.000 per il valori finali che userò). La proporzione di volte in cui hai respinto l'ipotesi nulla è il potere.
  4. ripetere quanto sopra per un'altra serie di condizioni.

Ecco un semplice esempio con regressione ordinale:

library(rms)

tmpfun <- function(n, beta0, beta1, beta2) {
    x <- runif(n, 0, 10)
    eta1 <- beta0 + beta1*x
    eta2 <- eta1 + beta2
    p1 <- exp(eta1)/(1+exp(eta1))
    p2 <- exp(eta2)/(1+exp(eta2))
    tmp <- runif(n)
    y <- (tmp < p1) + (tmp < p2)
    fit <- lrm(y~x)
    fit$stats[5]
}

out <- replicate(1000, tmpfun(100, -1/2, 1/4, 1/4))
mean( out < 0.05 )

6
NNN

2
@gung: il tuo commento ha un senso, ti dispiacerebbe aggiungere i tuoi codici in modo che anche meno persone con esperienza in R possano trarne vantaggio? grazie

1
Lo sto guardando di nuovo e ho un paio di domande: 1) Perché x è uniforme su 1:10? 2) Come lo generalizzeresti a più di 1 variabile indipendente?
Peter Flom - Ripristina Monica

1
@PeterFlom, x doveva essere qualcosa, quindi ho scelto (arbitrariamente) di averlo uniforme tra 0 e 10, avrebbe potuto essere anche normale, gamma, ecc. La cosa migliore sarebbe scegliere qualcosa che è simile a ciò che ci aspettiamo il reale x variabili da assomigliare. Per utilizzare più di 1 variabile predittiva, generale in modo indipendente (o da una normale multivariata, copula, ecc.), Quindi includili semplicemente nel pezzo eta1, ad es eta1 <- beta0 + beta1*x1 + beta2*x2 + beta3*x3.
Greg Snow,

1
replicatemeanα=0.05

3

Vorrei aggiungere un'altra cosa alla risposta di Snow (e questo vale per qualsiasi analisi di potenza tramite simulazione): presta attenzione a se stai cercando un test a 1 o 2 code. Programmi popolari come G * Power eseguono il test di default a 1 coda e se stai cercando di vedere se le tue simulazioni corrispondono (sempre una buona idea quando stai imparando come farlo), dovrai prima verificarlo.

Per fare in modo che Snow esegua un test a 1 coda, aggiungerei un parametro chiamato "tail" agli ingressi della funzione e inserirò qualcosa di simile nella funzione stessa:

 #two-tail test
  if (tail==2) fit$stats[5]

  #one-tail test
  if (tail==1){
    if (fit$coefficients[5]>0) {
          fit$stats[5]/2
    } else 1

La versione a 1 coda controlla sostanzialmente che il coefficiente sia positivo, quindi dimezza il valore p.


2

Oltre all'eccellente esempio di Snow, credo che tu possa anche fare una simulazione di potenza ricampionando da un set di dati esistente che ha il tuo effetto. Non proprio un bootstrap, dal momento che non stai campionando con la sostituzione la stessa n , ma la stessa idea.

Quindi, ecco un esempio: ho eseguito un piccolo esperimento di sé che ha dato una stima puntuale positiva, ma poiché era piccolo, non era quasi statisticamente significativo nella regressione logistica ordinale. Con quel punto-stima, quanto è grande un n avrei bisogno? Per varie possibili n , ho generato molte volte un set di dati ed eseguito la regressione logistica ordinale e ho visto quanto piccolo fosse il valore p :

library(boot)
library(rms)
npt <- read.csv("http://www.gwern.net/docs/nootropics/2013-gwern-noopept.csv")
newNoopeptPower <- function(dt, indices) {
    d <- dt[sample(nrow(dt), n, replace=TRUE), ] # new dataset, possibly larger than the original
    lmodel <- lrm(MP ~ Noopept + Magtein, data = d)
    return(anova(lmodel)[7])
}
alpha <- 0.05
for (n in seq(from = 300, to = 600, by = 30)) {
   bs <- boot(data=npt, statistic=newNoopeptPower, R=10000, parallel="multicore", ncpus=4)
   print(c(n, sum(bs$t<=alpha)/length(bs$t)))
}

Con l'output (per me):

[1] 300.0000   0.1823
[1] 330.0000   0.1925
[1] 360.0000   0.2083
[1] 390.0000   0.2143
[1] 420.0000   0.2318
[1] 450.0000   0.2462
[1] 480.000   0.258
[1] 510.0000   0.2825
[1] 540.0000   0.2855
[1] 570.0000   0.3184
[1] 600.0000   0.3175

In questo caso, a n = 600 la potenza era del 32%. Non molto incoraggiante.

(Se il mio approccio alla simulazione è sbagliato, per favore qualcuno me lo dica. Sto andando fuori da alcuni documenti medici che parlano della simulazione di potenza per la pianificazione di studi clinici, ma non sono affatto sicuro della mia precisa implementazione.)


0

Facendo riferimento alla prima simulazione (suggerita da Snow; /stats//a/22410/231675 ):

Non sono ancora sicuro di come dovrebbe essere la simulazione con più (in particolare, tre) variabili indipendenti. Comprendo che dovrei 'includerli tutti nel pezzo eta1, ad esempio eta1 <- beta0 + beta1 * x1 + beta2 * x2 + beta3 * x3' '(come menzionato sopra). Ma non so come regolare il resto dei parametri nella funzione. Qualcuno potrebbe darmi una mano con questo?


1
Penso che otterresti una risposta migliore se facessi una nuova domanda con un link a questa domanda.
mdewey,
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.