Маніпулювання логістичною регресійною моделлю


12

Я хотів би зрозуміти, що робить наступний код. Людина, яка написала код, вже не працює тут, і він майже повністю недокументований. Мене попросили дослідити це хтось, хто думає, що " це байєсівська модель логістичної регресії "

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

Я можу бачити, що вона відповідає логістичній моделі, приймає транспонування Чалсекі-факторизації оціненої матриці коваріації, помножує це на векторний малюнок з і потім додається до модельних оцінок. Потім його попередньо помножують на проектній матриці, береться зворотний логіт цього, порівнюючи з вектором малюнків з U (0,1), і отриманий бінарний вектор повертається. Але що це все означає статистично?N(0,1)U(0,1)


Напевно, багато би допомогло дізнатися, для якої галузі це використовується.
naught101

2
По суті, функція генерує дані з (частої) моделі ваших даних, включаючи невизначеність щодо фактичних параметрів. Це може бути частиною байєсівської програми MCMC, але також може бути використане при силовому аналізі потужності (nb, аналізи потужності на основі попередніх даних, які не враховують невизначеність, часто є оптимістичними ).
gung - Відновіть Моніку

Ласкаво просимо, @PSellaz. Оскільки ніхто більше не відповів, я перетворять це на "офіційну" відповідь.
gung - Відновіть Моніку

Відповіді:


7

Що функція робить:
По суті, функція генерує нові дані псевдовипадкової відповіді (тобто ) з моделі ваших даних. Використовувана модель - це стандартна модель частотизму. Як це прийнято, передбачається, що ваші дані * є відомими константами - вони ні в якому разі не відбираються. Я вважаю важливою особливістю цієї функції те, що вона містить непевність щодо оцінених параметрів. YX

* Зауважте, що вам потрібно вручну додати вектор до лівого стовпця вашої матриці перш ніж вводити його у функцію, якщо ви не хочете придушити перехоплення (що, як правило, не є хорошою ідеєю).1X

У чому полягала ця функція:
я чесно не знаю. Це могло бути частиною байєсівської програми MCMC, але це було б лише одне ціле - вам потрібно більше коду в іншому місці, щоб фактично провести байєсівський аналіз. Я не відчуваю достатнього досвіду байєсівських методів, щоб остаточно прокоментувати це, але ця функція не відчуває мене, як те, що зазвичай використовується.

Він також міг бути використаний при силових аналізах потужності. (Дивіться мою відповідь тут: Моделювання аналізу потужності логістичної регресії - розроблені експерименти для отримання інформації про цей тип речі.) Варто зазначити, що аналіз потужності на основі попередніх даних, які не враховують невизначеність оцінок параметрів, часто враховуються оптимістичний. (Я обговорюю цей момент тут: бажаний розмір ефекту проти очікуваного розміру ефекту .)

Якщо ви хочете скористатися цією функцією:
Як зазначає @whuber у коментарях, ця функція буде неефективною. Якщо ви хочете використовувати це для (наприклад) аналізу потужності, я розділив би цю функцію на дві нові функції. Перший буде читати у ваших даних і виводити параметри та невизначеності. Друга нова функція створила б нові псевдовипадкові даніНаведений нижче приклад (хоча це можливо вдосконалити далі): 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. Для мене дивна частина полягає в тому, що пристосування та модельовані прогнози виконуються в тілі однієї функції. Зазвичай такі операції здійснюються спочатку обчисленням підходу (повернення betaта M), а потім створенням численних імітаційних моделей на основі цього підходу. (Якщо встановити їх в одній і тій же функції, це зайво спричинить повторення пристосування кожного разу, значно сповільнюючи обчислення.) З цих симуляцій можна було б відновити ( серед іншого ) інтервали прогнозування для нелінійних або дуже складних комбінацій відповідей.
whuber

@whuber, я згоден. Я насправді думав про те, щоб запропонувати функцію розбити на дві різні функції перед тим, як використовувати їх для моделювання, але, здається, це не було частиною питання.
gung - Відновіть Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.