【问题标题】:Plotting drc model in ggplot2; issue with seq( )在ggplot2中绘制drc模型; seq() 的问题
【发布时间】:2017-02-19 10:58:42
【问题描述】:

在 ggplot2 中绘制时,我的模型不会继续朝向渐近线,尽管它在 R 基础图形中确实如此。在 ggplot2 中,它停在 X 轴上的某些点(图片如下),我 90% 确定这与 seq() 有关。

我正在使用predict() 转换来自 drm(剂量响应包)logit 模型的数据。在基础图形中,sigmoidal 曲线看起来很棒,在 ggplot2 中,没有那么多:

library(drc)
library(ggplot2)

将数据拟合到 logit 模型:

mod1 <- drm(probability ~ (dose), weights = total, data = mydata1,     type ="binomial", fct = LL.2())

plot(mod1,broken=FALSE,type="all",add=FALSE, col= "purple", xlim=c(0, 10000))

基本图形2参数logit的图像:

使用作者演示的代码提取模型的数据(链接如下),我有:

newdata1 <-expand.grid(dose=exp(seq(log(0.5),log(100),length=200)))

pm1<- predict(mod1, newdata=newdata1,interval="confidence")

newdata1$p1 <-pm1[,1]

newdata1$pmin1 <-pm1[,2]

newdata1$pmax1 <- pm1[,3]

最后是 ggplot2 图形:

p1 <- ggplot(mydata1, aes(x=dose01,y=probability))+
  geom_point()+
   geom_ribbon(data=newdata1, aes(x=dose,y=p1,
 ymin=pmin1,ymax=pmax1),alpha=0.2,color="blue",fill="pink") +
   geom_step(data=newdata1, aes(x=dose,y=p1))+
  coord_trans(x="log") +  #creates logline for x axis
  xlab("dose")+ylab("response")

图像 1&2 和 3&4 显示了我的情节中的差异,具体取决于 seq:

seq() 使用以下内容时,图形被拉出数据! (seq(log(0.5),**log(10000)**,length=200)))(图 1&2)

我不明白 seq() 尽管研究它。 我的情节怎么了?

似乎 seq 中的第一项定义了下限,但是第三项定义的是什么?您可以在图像 3 和 4 中看到这一点 - 图形很不错;我有点混淆了这个问题,但它仍然没有继续朝着infin方向发展。这是一个小问题,因为我将共同绘制 8 个 logit 模型。

对于使用 ggplot2 绘制 drc/drm 模型时遇到问题的任何人,以下帖子非常有帮助:搜索 用 ggplot2-and-drc 绘制剂量响应曲线
还有这个标题:plotting-dose-response-curves-with-ggplot2-and-drc

我已经按照 DRC 的作者的说明进行操作,可以在他的文章的支持信息中找到 - 上面使用了该代码的一部分。文章标题:使用 R 进行剂量反应分析,Christopher Ritz。 PlosOne。

数据:

> dput(mydata1)

structure(list(dose = c(25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 
25L, 25L, 25L, 25L, 25L, 25L, 25L, 75L, 75L, 75L, 75L, 75L, 75L, 
75L, 75L, 75L, 75L, 75L, 75L, 75L, 75L, 75L, 100L, 100L, 100L, 
100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 
100L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 
150L, 150L, 150L, 150L, 150L, 200L, 200L, 200L, 200L, 200L, 200L, 
200L, 200L, 200L, 200L, 200L, 200L, 200L, 200L, 200L), total = c(25L, 
25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 
25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 
25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 
25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 
25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 
25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L), affected = c(2L, 
0L, 0L, 0L, 0L, 1L, 1L, 2L, 2L, 4L, 1L, 1L, 4L, 0L, 10L, 0L, 
1L, 0L, 1L, 0L, 3L, 0L, 4L, 2L, 0L, 2L, 0L, 1L, 2L, 3L, 2L, 0L, 
2L, 0L, 0L, 4L, 0L, 1L, 2L, 3L, 0L, 21L, 1L, 3L, 1L, 2L, 7L, 
0L, 0L, 0L, 0L, 8L, 7L, 3L, 7L, 2L, 2L, 10L, 3L, 4L, 0L, 7L, 
0L, 3L, 3L, 20L, 25L, 22L, 23L, 22L, 18L, 14L, 20L, 20L, 21L), 
    probability = c(0.08, 0, 0, 0, 0, 0.04, 0.04, 0.08, 0.08, 
    0.16, 0.04, 0.04, 0.16, 0, 0.4, 0, 0.04, 0, 0.04, 0, 0.12, 
    0, 0.16, 0.08, 0, 0.08, 0, 0.04, 0.08, 0.12, 0.08, 0, 0.08, 
    0, 0, 0.16, 0, 0.04, 0.08, 0.12, 0, 0.84, 0.04, 0.12, 0.04, 
    0.08, 0.28, 0, 0, 0, 0, 0.32, 0.28, 0.12, 0.28, 0.08, 0.08, 
    0.4, 0.12, 0.16, 0, 0.28, 0, 0.12, 0.12, 0.8, 1, 0.88, 0.92, 
    0.88, 0.72, 0.56, 0.8, 0.8, 0.84)), .Names = c("dose", "total", 
"affected", "probability"), row.names = c(NA, -75L), class = "data.frame")

【问题讨论】:

    标签: r plot ggplot2 seq drc


    【解决方案1】:

    您误将dose 值赋予predict()aes(x) 值:

    log10000 <- exp(seq(log(0.5), log(10000), length=200))
    log1000 <- exp(seq(log(0.5), log(1000), length=200))
    
    log10000df <- as.data.frame(cbind(dose = log10000, predict(mod1, data.frame(dose = log10000), interval="confidence")))
    log1000df <- as.data.frame(cbind(dose = log1000, predict(mod1, data.frame(dose = log1000), interval="confidence")))
    
     ## a common part
    p0 <- ggplot(mydata1, aes(x = dose, y = probability)) +
      geom_point() + coord_trans(x="log") + 
      xlab("dose") + ylab("response") + xlim(0.5, 10001)
    
    p10000 <- p0 + geom_line(data = log10000df, aes(x = dose, y = Prediction)) +
      geom_ribbon(data = log10000df, aes(x = dose, y = Prediction, ymin = Lower, ymax = Upper),
                  alpha = 0.2, color = "blue", fill = "pink")
      
    p1000 <- p0 + geom_line(data = log1000df, aes(x = dose, y = Prediction)) +
      geom_ribbon(data = log1000df, aes(x = dose, y = Prediction, ymin = Lower, ymax = Upper),
                  alpha = 0.2, color = "blue", fill = "pink")
    

    【讨论】:

      【解决方案2】:

      请参阅?seq,了解seq 的条款的作用。 seq(log(.5), log(1000), length=200) 使 200 个数字均匀分布,从 log(0.5) 到 log(1000)。如果您不命名第三个参数(或指定by=XYZ),则它是数字之间的间距。

      因此,当您执行 seq(log(0.5), log(1000), length=200) 时,它会计算您在从 log(0.5) 到 log(1000) 的 200 点处的拟合度。

      我认为“走向无限”是指您希望线离开情节的边缘,而不是像链接图片中那样在边缘之前停止。默认情况下,ggplot 将尝试确保您绘制的所有内容都适合您的绘图,因此它会将轴扩展一点超出您的数据范围。

      如果你想限制它,只需使用+ xlim(c(lower, upper))

      (我在安装 drc 时遇到问题,因此无法重现您的示例;这是一个玩具)

      x = seq(0.5, 100, length=200)
      df <- data.frame(x=x, y=x^2)
      ggplot(df, aes(x=x, y=y)) + geom_line() + coord_trans(x="log")
      

      在上面,这条线延伸到 100(如预期的那样),并且限制超出了一点。如果我想让线条接触绘图的边缘,那么我可以(例如)将 x 限制精确地剪裁为 100 - 使用 limx 参数到 coord_trans

      ggplot(df, aes(x=x, y=y)) + geom_line() + coord_trans(x="log", limx=c(0.5, 100))
      

      因此,当您绘制模型时,请确定 x 轴的边界,并确保您根据这些值预测所有模型。然后将 x 限制限制在这些范围内,这些线条将显示为“走向无穷大”。

      【讨论】:

      • 感谢您的解释,但是...我在这里托管了另一张图片 imgur link 前两个 (A1,A2) 共享相同的 seq() 值,中间项设置为日志(10000)。底部的两个(B1,B2)设置为 log(1000)。我在 A2、B2 上设置了相同的 cartesian_coord() 限制。除此之外,代码中没有其他差异。 - 然而曲线(在 A 和 B 之间)是如此不同。 您能帮我理解为什么 A 组和 B 组的行为如此不同吗?
      • geom_point() 似乎正在使用不受seq() 术语影响的数据集绘制点;然而,模型曲线仍然与 x 轴上的较低剂量对齐,尽管我在哪里实施 log x coord_trans() 命令
      • cartesian_coord 是一个未转换的坐标系,即当您应用它时,您的对数转换将被撤消。这就是为什么。使用coord_translimx 参数与您问题中的代码兼容。
      • 我不知道! - 但无论如何,我看不出将限制设置在 log(10,000) 与 log(1,000) 是如何改变曲线的拟合的。您可以在 A1 和 B1 中看到这一点,其中曲线通过一个图中的点,而不是另一个。
      猜你喜欢
      • 2016-11-05
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多