Интерполяция шансов логит-сырой и скорректированной GAM-моделей - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть некоторые данные для подбора сырых и скорректированных логитов GAM:

library(mgcv)
## Simulate some data...
set.seed(3);n<-400
dat <- gamSim(1,n=n)
mu <- binomial()$linkinv(dat$f/4-2)
phi <- .5
a <- mu*phi;b <- phi - a;
dat$y <- rbeta(n,a,b) 

## Fitting GAMs
crude <- gam(y~s(x0),family=binomial(link="logit"),data=dat)
adj <- gam(y~s(x0)+s(x1)+s(x2)+s(x3),family=binomial(link="logit"),data=dat)

Теперь я бы перехватил значение x0 с коэффициентом шансов (ИЛИ) 1,00 (т.е. вероятность 0,50). Для этого я использую visreg с аргументом plot = FALSE.

## Prepare data for ggplotting 
library(visreg)
p.crude <- visreg(crude, "x0",  plot = FALSE)
p.adj <- visreg(adj, "x0",  plot = FALSE)

library(dplyr)
bind_rows(
mutate(p.crude$fit, Model = "crude"),
mutate(p.adj$fit, Model = "adj")
) -> fits

Ok. Я собираюсь вычислить ИЛИ из LogOR. Правильный ли следующий код?

# Compute ORs and CI from LogOR
fits$or <- exp(fits$visregFit)  
fits$ci.low <- exp(fits$visregLwr) 
fits$ci.up <- exp(fits$visregUpr) 

Теперь я использую approx для интерполяции значения x0 с ИЛИ 1.00

## Interpolate x0 which give OR 1.00 (or 50% of probability)
x.crude <- round(approx(x = crude$fitted.values, y=crude$model$x0, xout = .5)$y, 1)
x.adj <- round(approx(x = adj$fitted.values, y=adj$model$x0, xout = .5)$y, 1)

Наконец, я строю две модели на одном графике:

## Plotting using ggplot
library(ggplot2)
ggplot(data = fits) +
  geom_vline(aes(xintercept = x.crude), size=.2, color="black")+
  geom_vline(aes(xintercept = x.adj), size=.2, color="red")+
  annotate(geom ="text", x= x.crude - 0.05, y=.5, label = x.crude, size=3.5) +
  annotate(geom ="text", x= x.adj - 0.05, y=.5, label = x.adj, size=3.5, color="red") +
  geom_ribbon(aes(x0, ymin=ci.low, ymax=ci.up, group=Model, fill=Model), alpha=.05) +
  geom_line(aes(x0, or, group=Model, color=Model)) +
  labs(x="X0", y="Odds ratio")+
  theme_bw(16) 

enter image description here

Как видите, только грубая модель показывает перехват с OR, почти равным 1,00 (x0 = 0,9), в то время как для вспомогательной модели этого не происходит. Во-первых, как я могу получить интерполяцию с ИЛИ, которая точно в 1? Во-вторых ... С ограничением моих статистических знаний я понял, что должен был наблюдать перехват с OR = 1 для смежной модели, а также на основе наблюдаемых значений для x0 в соответствии с этой моделью. Почему относительная кривая настроена вверх?

...