Быстрый вопрос здесь. Я пытаюсь использовать пакет interactions для R, чтобы построить категориальные взаимодействия из модели логистической регрессии. В принципе, предположим, что у меня есть регрессия, в которой у меня есть взаимодействие factor1*factor2, я хотел бы создать график с ОШ и 95% ДИ factor2 уровней по factor1 уровням, а также указать p для взаимодействия.
Это мой текущий код:
library(interactions)
library(ggplot2)
library(dplyr)
set.seed(154)
outcome=sample(c(0,1), 1000, replace=TRUE)
set.seed(158)
factor1=sample(c("A","B"), 1000, replace=TRUE)
set.seed(1258)
factor2=sample(c("D","F"), 1000, replace=TRUE)
df <- data.frame(outcome, factor1, factor2)
df$outcome <- as.factor(df$outcome)
fit3 <- glm(outcome ~ factor1*factor2, data = df, family=binomial(link = "logit"))
cat_plot(fit3, pred = factor1, modx = factor2, interval = TRUE)
Что приводит к следующему результату:
Однако я не смог добавить метки OR и 95% CI поверх каждой строки, а также не смог добавить значения p для взаимодействия. Есть ли способ сделать это?





Существует компромисс с обертками ggplot, такими как cat_plot. Что вы выигрываете в простоте использования, вы теряете в возможности настройки сюжета. В этих обстоятельствах я бы предпочел использовать vanilla ggplot, но в этом случае не так уж сложно добавить соответствующие текстовые метки, добавив их в качестве слоев к существующим cat_plot
library(geomtextpath)
p <- cat_plot(fit3, pred = factor1, modx = factor2, interval = TRUE)
p2o <- function(x) round(x/(1 - x), 3)
p +
geom_textpath(data = data.frame(factor1 = c('A', 'A', 'B', 'B'),
factor2 = 'D',
outcome = c(0.625, 0.64, 0.64, 0.625)),
aes(label = paste('Interaction p =',
scales::pvalue(summary(fit3)$coef[4, 4]))),
color = 'black') +
geom_text(aes(y = ymax, label = paste0("OR ", p2o(outcome), '\n(',
p2o(ymin), ' - ', p2o(ymax), ')'),
group = factor2),
color = 'black', position = position_dodge(width = 0.9),
vjust = -0.5)
@userq8957289475 userq8957289475, насколько я могу судить, ось y на графике — это вероятность outcome, поэтому p2o просто преобразует вероятность в шансы. Я полагаю, что на этикетке должно быть написано «шансы», а не ИЛИ. Чтобы получить OR для каждого из A и B, потребуется добавить метку, сравнивающую D и F, где factor1 — это A, и другую, сравнивающую D и F, где factor1 — это B.
Спасибо за ответ, очень приятно. Могу я спросить вас, как вы рассчитали OR для записи поверх линейного графика? Я видел функцию «p2o», но я не могу понять, как это должно дать мне ИЛИ, начиная с логарифмических шансов. Я отредактировал свой вопрос, чтобы сделать его полностью воспроизводимым.