我正在运行逻辑回归以获得某些输入的概率。我将使用一个例子:
我想根据他们的 GRE 和 GPA 预测某人被研究生院录取的机会。使用 visreg 包,它很容易和很好地与床一起制作。
v1 <- visreg::visreg(
model,
"GPA",
scale = "response",
rug = 2,
xlab = "GPA",
ylab = "Pr(Accepted)",
type = "conditional",
by = "GRE",
breaks = c(
input$gre_in2 - 1,
input$gre_in2,
input$gre_in2 + 1
),
gg = TRUE,
fill.par = list(col = "#008DFF33")
)
在这个例子中,它将产生一个 ggplot2 图,在 3 个横截面上刻面 3 次,这是你的 GRE 分数 +/-1。然后它将向您显示该 GRE 分数的回归曲线以及您被录取的概率,因为 x 轴因 GPA 而异。
我的问题是 visreg 处理横截面的方式。Break 参数告诉它我想要哪些横截面。如果断点 = 一个数字,那么这就是横截面的数量(因此 80 将产生 80 个横截面,而不是 GRE=80 的横截面)。如果它是一个数字向量,那么它将在“by”变量的那些值处产生横截面。所以我只能有至少 2 个横截面。如果没有为中断输入参数,它将在第 10、50、90 个百分位数处进行,如果放入 (1),它将在平均值或中位数处进行横截面,我不确定。
另一个问题是我正在使这些图与 ggplotly 交互。我能够将此 ggobject 转换为 grob 对象,删除额外的列,然后将我想要的单个面绘制到新的 grid.newpage() 上,但是这样的绘图不能作为对象返回,我无法使其交互阴谋。
有没有一种方法可以使用 visreg 获得特定值的横截面,而无需使用横截面应该所在的点向量?或者我可以从 ggplot 对象中删除/子集一个方面吗?
谢谢
可重现的示例:请注意:我只使用 3 个 GRE 分数(假设我输入我的分数为 320)来构建 glm 模型。我构建模型的数据具有整个可能的分数范围。另请注意,我之所以选择 3 只是因为我需要在 break 参数中包含一个分数向量。我本可以选择 2,但显示 3 似乎更合适,因此您可以看到您的机会将如何改变 +/-1 GRE 分数。我添加了高达 326 的观察值,因此平均值/中位数不会是我想用作示例输入的 320。
nd2 <- data.frame(GRE = 319, GPA = seq(from = 2,to = 4.33,by = 0.01))
nd2 <- rbind(nd2, data.frame(GRE = 320,GPA = seq(from = 2,to = 4.33,by = 0.01)))
nd2 <- rbind(nd2, data.frame(GRE = 321,GPA = seq(from = 2,to = 4.33,by = 0.01)))
nd2 <- rbind(nd2, data.frame(GRE = 322,GPA = seq(from = 2,to = 4.33,by = 0.01)))
nd2 <- rbind(nd2, data.frame(GRE = 323,GPA = seq(from = 2,to = 4.33,by = 0.01)))
nd2 <- rbind(nd2, data.frame(GRE = 324,GPA = seq(from = 2,to = 4.33,by = 0.01)))
nd2 <- rbind(nd2, data.frame(GRE = 325,GPA = seq(from = 2,to = 4.33,by = 0.01)))
nd2 <- rbind(nd2, data.frame(GRE = 326,GPA = seq(from = 2,to = 4.33,by = 0.01)))
nd2$pr <- seq(0,1)
model <-
stats::glm(data = nd2,pr ~ GPA + GRE,family = stats::binomial(link = logit))
v1 <- visreg::visreg(
model,
"GPA",
scale = "response",
rug = 2,
xlab = "GPA",
ylab = "Pr(Accepted)",
type = "conditional",
by = "GRE",
breaks = c(
319,
320,
321
),
gg = TRUE
)
plotly::ggplotly(v1)