Моделирование логистической регрессии на основе сохраненных оценок в R

У меня есть небольшая проблема. Я пытаюсь разработать некоторый код, который позволит мне сделать следующее: 1) запустить анализ логистической регрессии, 2) извлечь оценки из анализа логистической регрессии и 3) использовать эти оценки для создания другой формулы логистической регрессии, которую я могу использовать в последующем моделировании исходной модели. Поскольку я относительно новичок в R, я понимаю, что могу извлечь эти коэффициенты 1 на 1 с помощью индексации, но трудно «масштабировать» это для моделей с разным количеством коэффициентов. Мне интересно, есть ли лучший способ извлечь коэффициенты и настроить формулу. Затем мне пришлось бы разрабатывать фактические переменные, но разработка этих переменных должна быть достаточно гибкой для любого количества переменных и распределений. Кажется, это легко сделать в Mplus (пример 12.7 в руководстве Mplus), но я не понял этого в R. Вот код, насколько я получил:

#generating the data
set.seed(1)
gender <- sample(c(0,1), size = 100, replace = TRUE)
age <- round(runif (100, 18, 80))
xb <- -9 + 3.5*gender + 0.2*age
p <- 1/(1 + exp(-xb))
y <- rbinom(n = 100, size = 1, prob = p)

#grabbing the coefficients from the logistic regression model
matrix_coef <- summary(glm(y ~ gender + age, family = "binomial"))$coefficients

the_estimates <- matrix_coef[,1]
the_estimates

the_estimates[1]
the_estimates[2]
the_estimates[3]

Я просто не могу понять, как заставить R создать формулу с переменными (x) и коэффициентами из исходной модели гибким образом, чтобы приспособить любое количество переменных и различных распределений. Это не классное задание, а необходимая часть исследования, которое я провожу. Любая помощь будет принята с благодарностью, и, пожалуйста, относитесь к этому как к обучающему моменту. Я действительно хочу этому научиться.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я не уверен на 100%, что ваш вопрос здесь.

Если вы хотите смоделировать новые данные из той же модели с теми же переменными-предикторами, вы можете использовать метод simulate():

dd <- data.frame(y, gender, age)
## best practice when modeling in R: take the variables from a data frame
model <- glm(y ~ gender + age, data = dd, family = "binomial")
simulate(model)

Вы можете создать несколько повторов, указав аргумент nsim= (или вы можете каждый раз моделировать заново через цикл for())

Если вы хотите смоделировать новые данные из другого набора переменных-предикторов, вам нужно проделать немного больше работы (некоторые типы моделей в R имеют аргумент newdata=, но, увы, не GLM):

## simulate new model matrix (including intercept)
simdat <- cbind(1,
                gender = rbinom(100, prob = 0.5, size = 1),
                age = sample(18:80, size = 100, replace = TRUE))
## extract inverse-link function
invlink <- family(model)$linkinv 
## sample new values
resp <- rbinom(n = 100, size = 1, prob = invlink(simdat %*% coef(model)))

Если вы хотите сделать это позже из сохраненных коэффициентов, замените полученный вектор коэффициентов на coef(model) в приведенном выше коде.

Если вы хотите гибко конструировать формулы, reformulate() — ваш друг, но я не понимаю, как это подходит здесь.


Если вы хотите (скажем) перенастроить модель 1000 раз на новые ответы, смоделированные из исходной подгонки модели (те же коэффициенты, те же предикторы: то есть параметрический бутстрап), вы можете сделать что-то вроде этого.

nsim <- 1000
res <- matrix(NA, ncol = length(coef(model)), nrow = nsim)
for (i in 1:nsim) {
   ## simulate returns a list (in this case, of length 1);
   ## extract the response vector 
   newresp <- simulate(model)[[1]]
   newfit <- update(model, newresp ~ .)
   res[i,] <- coef(newfit)
}

Вам не нужно хранить коэффициенты — вы можете извлекать/вычислять любые сводки модели, которые вам нравятся (соответствующим образом измените количество столбцов res).

Я хочу генерировать новые данные из тех же данных с теми же переменными-предикторами. После создания данных следующим шагом будет объединение данных во фрейм данных, а затем получение модели? Как мне настроить это, чтобы повторно запустить модель на новых данных из другого набора переменных-предикторов, скажем, 1000 раз? Будет ли это лучше всего выполнено с помощью «цикла for»? Я знаю, что это кажутся простыми вопросами, но этот метод генерации данных для меня нов.

George 21.10.2022 23:50

Это выглядит хорошо, и я довольно хорошо следую коду. На данный момент я сталкиваюсь со следующей ошибкой: «Ошибка в model.frame.default (формула = newresp ~ пол + возраст, данные = dd,: недопустимый тип (список) для переменной «newresp»» Как мне это исправить Я так рад быть так близко.

George 22.10.2022 01:39

Это сработало! Большое спасибо. Я проверил это, как ответил.

George 22.10.2022 01:54

Допустим, ваша матрица данных, включающая age и gender или любые другие предикторы, равна X. Затем вы можете использовать X в правой части вашей формулы glm, получить xb_hat <- X %*% the_estimates (или любую другую матрицу данных, заменяющую X, если она имеет те же столбцы) и подключить xb_hat к любой функции связи, которую вы хотите.

Другие вопросы по теме