Я пытаюсь получить прогнозируемые значения по всему диапазону, который охватывает исходный набор данных, используя пакет '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](https://i.stack.imgur.com/WRduo.png)
Проблема в том, что это не охватывает весь диапазон значений исходной переменной-предиктора. 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](https://i.stack.imgur.com/nmexZ.png)
Мне было интересно, был ли квантильный аргумент для этого, но это не сработало.
Effect("x1",model,quantiles=seq(0.1,0.99,by=0.01))
Кто-нибудь знает, можно ли вообще манипулировать предсказанными значениями Effect()
?