Manipolazione del modello di regressione logistica


12

Vorrei capire cosa sta facendo il seguente codice. La persona che ha scritto il codice non funziona più qui ed è quasi completamente priva di documenti. Mi è stato chiesto di indagarlo da qualcuno che pensa " è un modello di regressione logistica bayesiana "

bglm <- function(Y,X) {
    # Y is a vector of binary responses
    # X is a design matrix

    fit <- glm.fit(X,Y, family = binomial(link = logit))
    beta <- coef(fit)
    fs <- summary.glm(fit)
    M <- t(chol(fs$cov.unscaled))
    betastar <- beta + M %*% rnorm(ncol(M))
    p <- 1/(1 + exp(-(X %*% betastar)))
    return(runif(length(p)) <= p)
}

Vedo che si adatta a un modello logistico, prende la trasposizione della fattorizzazione di Cholseky della matrice di covarianza stimata, post-moltiplica questo per un vettore di disegni da e viene quindi aggiunto alle stime del modello. Questo viene quindi premoltiplicato dalla matrice di progettazione, il logit inverso di questo viene preso, rispetto a un vettore di disegni da e il vettore binario risultante restituito. Ma cosa significa statisticamente tutto ciò ?U ( 0 , 1 )N(0,1)U(0,1)


Probabilmente sarebbe di grande aiuto sapere in quale campo viene utilizzato questo ...
nought101

2
In sostanza, la funzione genera dati da un modello (frequentista) dei tuoi dati, incorporando l'incertezza sui parametri effettivi. Potrebbe far parte di una routine MCMC bayesiana, ma potrebbe anche essere utilizzato nell'analisi della potenza basata sulla simulazione (nb, le analisi della potenza basate su dati precedenti che non tengono conto dell'incertezza sono spesso ottimistiche ).
gung - Ripristina Monica

Prego, @PSellaz. Dato che nessun altro ha risposto, lo trasformerò in una risposta "ufficiale".
gung - Ripristina Monica

Risposte:


7

Cosa fa la funzione:
in sostanza, la funzione genera nuovi dati di risposta pseudocasuali (cioè ) da un modello dei dati. Il modello in uso è un modello frequentist standard. Come è consuetudine, si presume che i dati * siano costanti note - non vengono campionati in alcun modo. Quello che vedo come la caratteristica importante di questa funzione è che sta incorporando l'incertezza sui parametri stimati. XYX

* Nota che devi aggiungere manualmente un vettore di come colonna più a sinistra della tua matrice prima di immetterlo nella funzione, a meno che tu non voglia sopprimere l'intercetta (che generalmente non è una buona idea).X1X

Qual era il punto di questa funzione:
non lo so onestamente. Avrebbe potuto far parte di una routine MCMC bayesiana, ma sarebbe stato solo un pezzo - avresti bisogno di altro codice altrove per eseguire effettivamente un'analisi bayesiana. Non mi sento sufficientemente esperto dei metodi bayesiani per commentare in modo definitivo su questo, ma la funzione non mi "sente" come quello che verrebbe normalmente usato.

Potrebbe anche essere stato utilizzato nelle analisi di potenza basate sulla simulazione. (Vedi la mia risposta qui: Simulazione dell'analisi della potenza della regressione logistica - esperimenti progettati , per informazioni su questo tipo di cose.) Vale la pena notare che le analisi della potenza basate su dati precedenti che non tengono conto dell'incertezza delle stime dei parametri sono spesso ottimista. (Discuto questo punto qui: dimensione dell'effetto desiderato vs. dimensione dell'effetto previsto .)

Se si desidera utilizzare questa funzione:
Come osserva @whuber nei commenti, questa funzione sarà inefficiente. Se si desidera utilizzarlo per eseguire (ad esempio) analisi di potenza, dividerei la funzione in due nuove funzioni. Il primo leggeva i tuoi dati e produceva i parametri e le incertezze. La seconda nuova funzione genererebbe i nuovi dati pseudocasuali . Di seguito è riportato un esempio (sebbene possa essere possibile migliorarlo ulteriormente): Y

simulationParameters <- function(Y,X) {
                        # Y is a vector of binary responses
                        # X is a design matrix, you don't have to add a vector of 1's 
                        #   for the intercept

                        X    <- cbind(1, X)  # this adds the intercept for you
                        fit  <- glm.fit(X,Y, family = binomial(link = logit))
                        beta <- coef(fit)
                        fs   <- summary.glm(fit)
                        M    <- t(chol(fs$cov.unscaled))

                        return(list(betas=beta, uncertainties=M))
}

simulateY <- function(X, betas, uncertainties, ncolM, N){

             # X      <- cbind(1, X)  # it will be slightly faster if you input w/ 1's
             # ncolM  <- ncol(uncertainties) # faster if you input this
             betastar <- betas + uncertainties %*% rnorm(ncolM)
             p        <- 1/(1 + exp(-(X %*% betastar)))

             return(rbinom(N, size=1, prob=p))
}

4
+1. Per me, la parte strana è che l'adattamento e le previsioni simulate sono tutte fatte all'interno del corpo di una singola funzione. Normalmente, operazioni come questa verrebbero eseguite prima calcolando l'adattamento (ritorno betae M) e quindi creando numerose simulazioni iid basate su questo adattamento. (Metterli nella stessa funzione provocherebbe inutilmente la ripetizione del raccordo ogni volta, rallentando notevolmente i calcoli.) Da queste simulazioni, si potrebbero recuperare ( tra l'altro ) intervalli di predizione per combinazioni non lineari o molto complicate delle risposte.
whuber

@whuber, sono d'accordo. In realtà stavo pensando di suggerire che la funzione fosse suddivisa in 2 diverse funzioni prima di essere utilizzata per la simulazione, ma non sembrava che facesse parte della domanda.
gung - Ripristina Monica
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.