我在R中使用Grata包中的DRAW和COMPARE_Smooths函数来创建绘图,可视化来自两个逻辑游戏的平滑.我想编辑这些曲线图,以(1)包括原始数据;(2)具有Logistic变换的y轴,以便y轴值表示0-1之间的概率.使用这些函数有什么简单的方法可以做到这一点吗?

使用这些帖子(Gratia package: probability instead of log odds for plotting generalized additive model (GAM)Plotting GAMM model results with package gratia)的建议,我可以成功地绘制概率图,而不是记录单个模型的赔率,但在使用DRAW on Compare_Smooths对象时,我不确定如何做到这一点.我也不确定如何用一个单独的模型来显示带有重新zoom 的y轴的曲线图上的原始数据.

此外,对于绘制单个模型,我知道添加"residuals=T"可以实现我想要的效果,但同样,使用Compare_Smooths不能做到这一点.

下面是一些示例代码



#simulate data
set.seed(9)
df1 <- data.frame(response=c(rep(0,500), rep(1,500)),
                  p1 = c(rnorm(500,100,5),rnorm(500,110,3)),
                  p2 = rnorm(1000,10,2))


df2 <- data.frame(response=sample(c(0,1),1000, replace = T),
                  p1 = rnorm(1000,80,10),
                  p2 = rnorm(1000,15,1))

#create models
m1 <- gam(response ~ s(p1,bs="cr") + s(p2, bs="cr"),
                          data = df1, family=binomial, method = "REML", select=T)
m2 <- gam(response ~ s(p1,bs="cr") + s(p2, bs="cr"),
          data = df2, family=binomial, method = "REML", select=T)

#compare smooths
comp <- compare_smooths(m1,m2)

#visualize compared smooths
draw(comp)

#example of desired y-axis scaling for single model 
#(two different methods, similar results)
draw(smooth_estimates(m1), fun = inv_link(m1))
draw(m1, constant = coef(m1)[1], fun = inv_link(m1))

#example of raw data on plot for single model
draw(m1, residuals=T)

推荐答案

根据各自的模型,根据响应量表进行预测,然后绘制出结果的拟合值,会更容易.由于这实际上是在响应范围内(因为它包括模型截获),这可以说是一个更好的情节.

library("ggplot2")
library("dplyr")
library("gratia") # use dev version on github or modify #! ggplot

N <- 100
r_p1 <- range(c(df1$p1, df2$p1))
ds <- data_slice(m1, p1 = evenly(p1, lower = r_p1[1], upper = r_p1[2], n = N))

fv_p1_m1 <- fitted_values(m1, data = ds, exclude = "s(p2)")
fv_p1_m2 <- fitted_values(m2, data = ds, exclude = "s(p2)")

fv_p1 <- fv_p1_m1 |>
  bind_rows(fv_p1_m2) |>
  mutate(.model = rep(c("m1", "m2"), each = N))

fv_p1 |> #! modify variable names in aes() calls below if using CRAN's gratia
  ggplot(aes(x = p1, y = .fitted, group = .model)) +
  geom_ribbon(aes(ymin = .lower_ci, ymax = .upper_ci,
    fill = .model), alpha = 0.2) +
  geom_line(aes(colour = .model))

没有经过测试;我刚刚离开了我的机器.

如果你的really不想把截取包括在内(所以可以直接与compare_smooths()相比,请替换

exclude = "s(p2)"

使用

terms = "s(p1)"

fitted_values()个电话中.要实现这一点,您需要使用全新版本的{mgcv},因为Simon在不久前更改了termsexclude的工作方式.

R相关问答推荐

如何在四进制仪表板值框中显示值(使用shiny 的服务器计算)

根据收件箱中的特定值提取列名

R中的子集文件—读取文件名索引为4位数字序列,例如0001到4000,而不是1到4000)

如何计算R数据集中每个女性的子元素数量?

修改用R编写的用户定义函数

然后根据不同的列值有条件地执行函数

lightgbm发动机在tidymmodels中的L1正则化""

在for循环中转换rabrame

在R中使用数据集名称

条形图和在Ploly中悬停的问题

在R gggplot2中是否有一种方法将绘图轴转换成连续的 colored颜色 尺度?

计算直线上点到参考点的总距离

根据约束随机填充向量的元素

警告消息";没有非缺失的参数到min;,正在返回数据中的inf";.表分组集

使用geom_iles在一个切片中包含多个值

在鼠标悬停时使用Plotly更改geom_point大小

在GT()中的列之间添加空格

从矩阵创建系数图

从字符串01JAN2021创建日期

Ggplot2水平线和垂直线的图例图标不匹配