Manipulation du modèle de régression logistique

12

Je voudrais comprendre ce que fait le code suivant. La personne qui a écrit le code ne travaille plus ici et il est presque complètement sans papiers. Une personne qui pense que " c'est un modèle de régression logistique bayésienne " m'a demandé d'enquêter

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)
}

Je peux voir qu'elle s'adapte à un modèle logistique, prend la transposition de la factorisation de Cholseky de la matrice de covariance estimée, la multiplie par un vecteur de tirages à partir de et est ensuite ajoutée aux estimations du modèle. Ceci est ensuite prémultiplié par la matrice de conception, le logit inverse de celui-ci est pris, comparé à un vecteur de tirages de U ( 0 , 1 ) et au vecteur binaire résultant retourné. Mais qu'est-ce que tout cela signifie statistiquement?N(0,1)U(0,1)

P Sellaz
la source
Cela aiderait probablement beaucoup de savoir dans quel domaine cela est utilisé ..
naught101
2
En substance, la fonction génère des données à partir d'un modèle (fréquentiste) de vos données, incorporant l'incertitude sur les paramètres réels. Il pourrait faire partie d'une routine bayésienne MCMC, mais pourrait également être utilisé dans l' analyse de puissance basée sur la simulation (nb, les analyses de puissance basées sur des données antérieures qui ne prennent pas en compte l'incertitude sont souvent optimistes ).
gung - Rétablir Monica
Vous êtes les bienvenus, @PSellaz. Puisque personne d'autre n'a répondu, je vais en faire une réponse «officielle».
gung - Rétablir Monica

Réponses:

7


YX

1X

Quel était l'intérêt de cette fonction:
je ne sais pas honnêtement. Cela aurait pu faire partie d'une routine bayésienne MCMC, mais cela n'aurait été qu'une seule pièce - vous auriez besoin de plus de code ailleurs pour réellement exécuter une analyse bayésienne. Je ne me sens pas suffisamment expert sur les méthodes bayésiennes pour commenter définitivement cela, mais la fonction ne me «sent» pas comme ce qui serait généralement utilisé.

Il aurait également pu être utilisé dans des analyses de puissance basées sur la simulation. (Voir ma réponse ici: Simulation de l'analyse de puissance de régression logistique - expériences conçues , pour des informations sur ce type de chose.) Il convient de noter que les analyses de puissance basées sur des données antérieures qui ne prennent pas en compte l'incertitude des estimations des paramètres sont souvent optimiste. (Je discute de ce point ici: taille d'effet souhaitée vs taille d'effet attendue .)


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))
}
gung - Réintégrer Monica
la source
4
+1. Pour moi, la partie étrange est que l'ajustement et les prédictions simulées sont tous effectués dans le corps d'une seule fonction. Normalement, des opérations comme celle-ci seraient effectuées en calculant d'abord l'ajustement (retour betaet M), puis en créant de nombreuses simulations iid basées sur cet ajustement. (Les placer dans la même fonction entraînerait inutilement la répétition de l'ajustement à chaque fois, ce qui ralentirait considérablement les calculs.) À partir de ces simulations, on pourrait récupérer ( entre autres ) des intervalles de prédiction pour des combinaisons non linéaires ou très compliquées des réponses.
whuber
@whuber, je suis d'accord. Je pensais en fait à suggérer que la fonction soit divisée en 2 fonctions différentes avant d'être utilisée pour la simulation, mais il ne semblait pas que cela faisait partie de la question.
gung - Rétablir Monica