У меня есть небольшая проблема. Я пытаюсь разработать некоторый код, который позволит мне сделать следующее: 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) и коэффициентами из исходной модели гибким образом, чтобы приспособить любое количество переменных и различных распределений. Это не классное задание, а необходимая часть исследования, которое я провожу. Любая помощь будет принята с благодарностью, и, пожалуйста, относитесь к этому как к обучающему моменту. Я действительно хочу этому научиться.
Я не уверен на 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
).
Это выглядит хорошо, и я довольно хорошо следую коду. На данный момент я сталкиваюсь со следующей ошибкой: «Ошибка в model.frame.default (формула = newresp ~ пол + возраст, данные = dd,: недопустимый тип (список) для переменной «newresp»» Как мне это исправить Я так рад быть так близко.
Это сработало! Большое спасибо. Я проверил это, как ответил.
Допустим, ваша матрица данных, включающая age
и gender
или любые другие предикторы, равна X
. Затем вы можете использовать X
в правой части вашей формулы glm
, получить xb_hat <- X %*% the_estimates
(или любую другую матрицу данных, заменяющую X
, если она имеет те же столбцы) и подключить xb_hat
к любой функции связи, которую вы хотите.
Я хочу генерировать новые данные из тех же данных с теми же переменными-предикторами. После создания данных следующим шагом будет объединение данных во фрейм данных, а затем получение модели? Как мне настроить это, чтобы повторно запустить модель на новых данных из другого набора переменных-предикторов, скажем, 1000 раз? Будет ли это лучше всего выполнено с помощью «цикла for»? Я знаю, что это кажутся простыми вопросами, но этот метод генерации данных для меня нов.