使用geom_smooth强制设置截距

3
我想制作一个比较图,比较两个变量,并在两个产品的geom_smooth()上叠加。测量理论需要以(x=0;y=0)为起点,但是当我制作图表时,使用geom_smooth()创建的蓝色回归线并没有通过坐标 (0;0)。是否可能对此geom_smooth()进行修正,使其固定在定义的第一个点(0;0)的特定坐标处?
以下是代码:
library(ggplot2)

RawData <- data.frame(
  "Time" = c(0, 3, 6, 9, 24, 30, 34, 48, 57, 0, 3, 6, 9, 24, 30, 34, 48, 57), 
  "Curing" = c(0, 11.36, 31.81, 34.09, 75, 86.36, 97.7, 100, 100, 0, 77.5, 92, 95, 98, 100, 100, 100, 100), 
  "Grade" = c("Product A", "Product A", "Product A", "Product A", "Product A", "Product A", "Product A", "Product A", "Product A", "Product B", "Product B", "Product B", "Product B", "Product B", "Product B", "Product B", "Product B", "Product B"))

attach(RawData)

Graph <- ggplot(data=RawData, aes(x=`Time`, y=`Curing`, col=Grade)) + 
  geom_point(aes(color = Grade), shape = 1, size = 2.5) + 
  geom_smooth(level=0.50, span = 0.9999999999) +
  scale_color_manual(values=c('#f92410','#644196')) + 
  xlab("Tempo espresso in ore") + 
  ylab("% Di reticolazione") + 
  labs(color='') + 
  theme(legend.justification = "top")

Graph + geom_rug(aes(color = Grade))

这里输入图片描述

感谢您提前的任何帮助!!


代码中有一个错误,我已经修复了。 - GiacomoDB
1个回答

4

geom_smooth提供了多种平滑方法。 对于GLM/LM/GAMs,您可以明确指定带有截距为零的公式,例如geom_smooth(method="lm", formula=y~x+0)。 对于loess而言,这种方法不起作用,因为它是小型数据集(N<1,000)中默认的方法,可能因为它拟合局部数据。

在本例中,使用了loess平滑方法,因此要强制拟合过原点,则可以通过对每个组中的数据集中的点(0,0)分别分配非常高的权重来实现。 可以使用以下代码:

library(ggplot2)

RawData <- data.frame("Time" = c(0, 3, 6, 9, 24, 30, 34, 48, 57, 0, 3, 6, 9, 24, 30, 34, 48, 57), "Curing" = c(0, 11.36, 31.81, 34.09, 75, 86.36, 97.7, 100, 100, 0, 77.5, 92, 95, 98, 100, 100, 100, 100), "Grade" = c("Product A", "Product A", "Product A", "Product A", "Product A", "Product A", "Product A", "Product A", "Product A", "Product B", "Product B", "Product B", "Product B", "Product B", "Product B", "Product B", "Product B", "Product B"))

RawData$weight  = ifelse(RawData$Time==0, 1000, 1)

Graph <- ggplot(data=RawData, aes(x=`Time`, y=`Curing`, col=Grade)) + geom_point(aes(color = Grade), shape = 1, size = 2.5) + 
  geom_smooth(aes(weight=weight), level=0.50, span = 0.9999999999) + 
  scale_color_manual(values=c('#f92410','#644196')) + xlab("Tempo espresso in ore") + ylab("% Di reticolazione") + labs(color='') + theme(legend.justification = "top")
Graph + geom_rug(aes(color = Grade))

这会使得模型拟合非常接近原点,生成所需的图形:

输入图像描述


非常感谢你,Miff!它能够正常工作。你帮了我很多!! - GiacomoDB
1
虽然这对于像loess这样的灵活曲线应该非常有效,但对于GLM来说,实际上可能会产生很大的差异。有没有关于强制截距为零的可能性的更新(就像在公式中使用“+0”来完成GLM一样)? - yeahman269
1
@yeahman269,希望现在在开头增加的段落已经涵盖了这种情况。 - Miff
非常感谢!我之前不知道这个! - yeahman269

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接