我有这个数据框:
> dat
x y yerr
1 -1 -1.132711 0.001744498
2 -2 -2.119657 0.003889120
3 -3 -3.147378 0.007521881
4 -4 -4.220129 0.012921450
5 -5 -4.586586 0.021335644
6 -6 -5.389198 0.032892630
7 -7 -6.002848 0.048230946
Run Code Online (Sandbox Code Playgroud)
我可以用标准误差平滑绘制它:
p <- ggplot(dat, aes(x=x, y=y)) + geom_point()
p <- p + geom_errorbar(data=dat, aes(x=x, ymin=y-yerr, ymax=y+yerr), width=0.09)
p + geom_smooth(method = "lm", formula = y ~ x)
Run Code Online (Sandbox Code Playgroud)

但我需要的是使用yerr来拟合我的线性模型.用ggplot2可以吗?
好吧,我找到了回答这个问题的方法.
由于在我们收集数据的任何科学实验中,如果正确执行该实验,则所有数据值必须具有关联的错误.
在某些情况下,误差的方差在所有点上可能相等,但在许多情况下,如原始问题中的当前情况状态,这是不正确的.因此,在将曲线拟合到数据时,我们必须在不同测量的误差值方差中使用不同的方法.
这样做的方法是将权重归因于误差值,根据统计分析方法,误差值等于1/sqrt(errorValue),因此,它变为:
p <- ggplot(dat, aes(x=x, y=y, weight = 1/sqrt(yerr))) +
geom_point() +
geom_errorbar(aes(ymin=y-yerr, ymax=y+yerr), width=0.09) +
geom_smooth(method = "lm", formula = y ~ x)
Run Code Online (Sandbox Code Playgroud)

对于任何模型拟合,我会在我正在使用的绘图范例之外进行拟合.为此,将值传递weights给与观察值的方差成反比的值.然后通过加权最小二乘法完成拟合.
对于示例/情况ggplot的geom_smooth为你做以下.惠斯特似乎更容易使用geom_Smooth,直接拟合模型的好处最终超过了这一点.例如,您拥有合适的模型,可以对模型的拟合,假设等进行诊断.
适合加权最小二乘法
mod <- lm(y ~ x, data = dat, weights = 1/sqrt(yerr))
Run Code Online (Sandbox Code Playgroud)
然后predict()从范围内的模型x
newx <- with(dat, data.frame(x = seq(min(x), max(x), length = 50)))
pred <- predict(mod, newx, interval = "confidence", level = 0.95)
Run Code Online (Sandbox Code Playgroud)
在上面我们得到了predict.lm生成适当的置信区间以供使用的方法.
接下来,准备用于绘图的数据
pdat <- with(data.frame(pred),
data.frame(x = newx, y = fit, ymax = upr, ymin = lwr))
Run Code Online (Sandbox Code Playgroud)
接下来,构建情节
require(ggplot2)
p <- ggplot(dat, aes(x = x, y = y)) +
geom_point() +
geom_line(data = pdat, colour = "blue") +
geom_ribbon(mapping = aes(ymax = ymax, ymin = ymin), data = pdat,
alpha = 0.4, fill = "grey60")
p
Run Code Online (Sandbox Code Playgroud)