我需要使用加权对数 - 对数线性模型的指数形式绘制指数种 - 面关系,其中每个位置/ Bank(sb$NoSpec.mean
)的平均物种数由物种数的方差加权年(sb$NoSpec.var
)。
我能够绘制拟合,但是有问题可以找出如何在这个拟合周围绘制置信区间。以下是迄今为止我提出的最好的。对我有什么建议吗?
# Data
df <- read.csv("YearlySpeciesCount_SizeGroups.csv")
require(doBy)
sb <- summaryBy(NoSpec ~ Short + Area + Regime + SizeGrp, df,
FUN=c(mean,var, length))
# Plot to fill
plot(S ~ A, xlab = "Bank Area (km2)", type = "n", ylab = "Species count",
ylim = c(min(S), max(S)))
text(A, S, label = Pisc$Short, col = 'black')
# The Arrhenius model
require(vegan)
gg <- data.frame(S=S, A=A, W=W)
mloglog <- lm(log(S) ~ log(A), weights = 1 / (log10(W + 1)), data = gg)
# Add exponential fit to plot (this works well)
lines(xtmp, exp(predict(mloglog, newdata = data.frame(A = xtmp))),
lty=1, lwd=2)
现在我想添加置信乐队......这就是我发现问题的地方......
## predict using original model.. get standard errors
pp<-data.frame(A = xtmp)
p <- predict(mloglog, newdata = pp, se.fit = TRUE)
pp$fit <- p$fit
pp$se <- p$se.fit
## Calculate lower and upper bounds for each estimate using standard error * 1.96
pp$upr95 <- pp$fit + (1.96 * pp$se)
pp$lwr95 <- pp$fit - (1.96 * pp$se)
但我不确定以下内容是否正确。在搜索google / stack overflow / cross validated时,我无法找到任何不涉及ggplot
的答案。
## Create new linear models to create a fitted line given upper and lower bounds?
upr <- lm(log(upr95) ~ log(A), data=pp)
lwr <- lm(log(lwr95) ~ log(A), data=pp)
lines(xtmp, exp(predict(upr, newdata=pp)), lty=2, lwd=1)
lines(xtmp, exp(predict(lwr, newdata=pp)), lty=2, lwd=1)
提前感谢您的帮助!
答案 0 :(得分:3)
这个问题可以不提供数据,因为:
我会做一个简短的回答,因为我看到你在上一次更新中添加了“已解决”以质疑标题。请注意,建议不要在问题标题中添加此类关键字。如果解决了问题,请使用答案。
严格来说,使用1.96
是不正确的。您可以阅读How does predict.lm() compute confidence interval and prediction interval?了解详情。我们需要残余自由度和0.025分布的t分布。
我想说的是,predict.lm
可以为您返回置信区间:
pp <- data.frame(A = xtmp)
p <- predict(mloglog, newdata = pp, interval = "confidence")
p
将是一个三列矩阵,“fit”,“lwr”和“upr”。
由于您安装了对数 - 对数模型,因此需要对拟合值和置信区间进行反向变换。只需在此矩阵exp
上点击p
:
p <- exp(p)
现在您可以轻松使用matplot
生成很好的回归图:
matplot(xtmp, p, type = "l", col = c(1, 2, 2), lty = c(1, 2, 2))