Получить более широкий диапазон прогнозируемых значений из пакета «эффектов» - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь получить прогнозируемые значения по всему диапазону, который охватывает исходный набор данных, используя пакет 'Effects' в R, но вычисленный диапазон значений ограничен и имеет несколько точек данных.

Я могу сделать это вручную вне пакета «эффектов», но специально пытался сделать это внутри него.

У меня есть модель логистической регрессии, значения которой я прогнозирую:

library(lme4)
library(effects)

y <- rep(c(0,0,0,0,1),20)
x1 <- rnorm(100,0,0.5)
x2 <- as.integer(rnorm(100,5,2.5))
x2[which(x2<0)] <- 0 

r1 <- rep(letters[1:26],length.out = 100)

df<- data.frame(y,x1,x2,r1)

model <- glmer( y ~ x1 + x2 +(1|r1), data = df, family = binomial)

Используя Effect() Я вычислил некоторые предсказанные значения и нанес их на график с помощью ggplot.

eff_df<- data.frame(Effect("x1",model))

#plot 1   
ggplot(eff_df) +
  scale_x_continuous(limits=c(-1.5,1.5))+
  scale_y_continuous(limits=c(0.0,0.4))+
  geom_line(data = eff_df, aes(x = x1, y = fit),size = 2, colour="red")

plot 1

Проблема в том, что это не охватывает весь диапазон значений исходной переменной-предиктора. Effect() здесь идет только от -1 до 1 с 5 значениями, поэтому с сильно изогнутой подгонкой не будет очень гладкой.

max(x1) 
# [1] 1.386848
min(x1) 
# [1] -1.115965

Effect("x1",model)
# x1 effect
# x1
#        -1      -0.5         0       0.5         1 
# 0.1280189 0.1582372 0.1940015 0.2355868 0.2829567 

Чтобы вручную рассчитать подобранные значения, я сделал это, и вы можете увидеть диапазон, который должен быть предсказан как Effect()

fake.x1 <- seq(max(x1),min(x1),length.out = 50)
fake.x2 <- seq(mean(x2),mean(x2),length.out = 50)

predicted.y <-
summary(model)$coefficients[1,1] +
summary(model)$coefficients[2,1] * fake.x1 +
summary(model)$coefficients[3,1] * fake.x2

bt.predicted.y <- exp(predicted.y)/(1+exp(predicted.y))

manual_df <- data.frame(bt.predicted.y,predicted.y,fake.x1,fake.x2)

#plot 2    
ggplot(eff_df) +
  scale_x_continuous(limits=c(-1.5,1.5))+
  scale_y_continuous(limits=c(0.0,0.4))+
  geom_line(data = manual_df, aes(x = fake.x1, y = bt.predicted.y),size=2, colour = "black") +
  geom_line(data = eff_df, aes(x = x1, y = fit),size=2, colour = "red")

plot 2

Мне было интересно, был ли квантильный аргумент для этого, но это не сработало.

Effect("x1",model,quantiles=seq(0.1,0.99,by=0.01)) 

Кто-нибудь знает, можно ли вообще манипулировать предсказанными значениями Effect()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...