ggplot geom_smooth(使用glm和y~poly(x,2)和glm(),ggplot外的approx()不匹配

时间:2018-03-27 19:20:17

标签: r ggplot2

>DF
x.values y.values
0        1.0000000          
2        0.5443318          
4        0.4098546          
6        0.3499007  

ggplot(DF, aes(x=x.values, y=y.values)) + 
     geom_point() +
     geom_smooth(se=FALSE, method = "glm", formula= y ~ poly(x,2))

给我一​​个多项式拟合数据,如下所示:

this

从图像中我可以直观地估计y.value = 0.5的外推x.value,为~2.5-2.6。

然而,当我估计ggplot之外的插值x.value时,我得到了 值2.78。

M <- glm(formula = y.values ~ poly(x.values,2), data = DF)
t0.5 <- approx(x = M$fitted, y = DF$x.values, xout=0.50)$y
t0.5
[1] 2.780246

任何人都可以解释这种差异吗?

1 个答案:

答案 0 :(得分:3)

模型预测来自y.values的{​​{1}},因此模型的x.values值为fitted,而非y.values。因此,代码应为x.values。进行此更改后,您可以看到线性插值和模型预测是通过目视检查绘图所期望的。

t0.5 <- approx(x = DF$x.values, y = fitted(M), xout=0.50)$y

enter image description here

回复评论:要在任何给定的y计算x,您可以使用二次公式。回归方程是:

p = ggplot(DF, aes(x=x.values, y=y.values)) + 
  geom_point() +
  geom_smooth(se=FALSE, method = "glm", formula= y ~ poly(x,2))


M <- glm(formula = y.values ~ poly(x.values,2), data = DF)

# linear interpolation of fitted values at x.values=0.5
t0.5 <- approx(x = DF$x.values, y = fitted(M), xout=0.50)$y

# glm model prediction at x.values=0.5
predy = predict(M, newdata=data.frame(x.values=0.5))

# Data frame with linear interpolation of predictions along the full range of x.values
interp.fit = as.data.frame(approx(x=DF$x.values, y=fitted(M), 
                                  xout=seq(min(DF$x.values), max(DF$x.values),length=100)))

p + 
  geom_line(data=interp.fit, aes(x,y), colour="red", size=0.7) +
  annotate(x=0.5, y=t0.5, geom="point", shape=3, colour="red", size=4) +
  annotate(x=0.5, y=predy, geom="point", shape=16, colour="purple", size=4)

其中a,b和c是回归系数(相对于y = a*x^2 + b*x + c 返回的值反转顺序)。

coef(M)

现在只应用二次公式为0 = a*x^2 + b*x + (c - y) 的任何给定值获取x的两个值(其中y被约束在回归函数的范围内),注意到标准二次公式中的y系数在此处被c取代。