我有这个数据框:
> 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
我可以用标准误差平滑绘制它:
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)
但我需要的是使用 yerr 来适应我的线性模型。是否可以使用ggplot2?
答案 0 :(得分:7)
好吧,我找到了回答这个问题的方法。
由于在我们收集数据的任何科学实验中,如果正确执行该实验,则所有数据值都必须存在关联错误。
在某些情况下,错误的方差在所有点上可能相等,但在很多情况下,如原始问题中的当前情况状态,这是不正确的。所以我们必须使用在将曲线拟合到我们的数据时,不同测量值的误差值的方差不同。
这样做的方法是将权重归因于错误值,根据统计分析方法等于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)
答案 1 :(得分:6)
对于任何模型拟合,我会在我正在使用的绘图范例之外进行拟合。为此,将值传递给weights
,该值与观察值的方差成反比。然后通过加权最小二乘法完成拟合。
对于您的示例/情况 ggplot ,geom_smooth
正在为您执行以下操作。惠斯特似乎更容易使用geom_Smooth
,直接拟合模型的好处最终会超过这个。例如,您拥有合适的模型,可以对模型的拟合,假设等进行诊断。
适合加权最小二乘法
mod <- lm(y ~ x, data = dat, weights = 1/sqrt(yerr))
然后在predict()
x
newx <- with(dat, data.frame(x = seq(min(x), max(x), length = 50)))
pred <- predict(mod, newx, interval = "confidence", level = 0.95)
在上面我们使用predict.lm
方法生成适当的置信区间以供使用。
接下来,准备用于绘图的数据
pdat <- with(data.frame(pred),
data.frame(x = newx, y = fit, ymax = upr, ymin = lwr))
接下来,构建情节
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
答案 2 :(得分:1)
你的问题有点模糊。以下是一些可以帮助您入门的建议。
ggplot2只是使用lm
函数进行回归。要获得这些值,请执行以下操作:
lm(y ~ x, data=dat)
这将为您提供y轴截距和渐变。
您可以使用stat_smooth
参数关闭se
中的标准错误:
.... + geom_smooth(method = "lm", formula = y ~ x, se = FALSE)
您可以使用以下内容在点/错误带中添加功能区:
##This doesn't look good.
.... + geom_ribbon(aes(x=x, ymax =y+yerr, ymin=y-yerr))