【发布时间】:2019-05-28 21:29:18
【问题描述】:
我正在使用多元 GAM 模型来详细了解多个地区的雾趋势。雾是由低于某个阈值(
但是,我现在面临的挑战是,我真的希望 y 轴成为实际的能见度观测值,而不是居中的平滑值。 有趣的是,看到协变量相对于该位置的平均能见度如何影响能见度,但是对于平均能见度不同的多个位置(因此 0 点在提高或降低可见度的意义不大)。
为了比较多个位置的结果,我正在尝试对 y 轴进行实际能见度观察,然后在我们有兴趣查看的能见度阈值(400 m)处画一条线 评估低于该阈值的预测变量值是什么样的(例如,什么温度与低于 400 m 的能见度相关)。
总的来说,在 GAM 和 R 方面,我仍然是初学者,但到目前为止我已经找到了一些有用的部分。
到目前为止有用的东西:
尝试1.如何为模型中的每个变量提取gam fit Extracting data used to make a smooth plot in mgcv
尝试2.如何使用predict函数重构单变量模型 http://zevross.com/blog/2014/09/15/recreate-the-gam-partial-regression-smooth-plots-from-r-package-mgcv-with-a-little-style/
尝试 3. 如何使用“拟合”获得一些看起来像可见性观察的 y 轴 - 虽然我不认为这是 正确的方法,因为我没有考虑拦截 http://gsp.humboldt.edu/OLM/R/05_03_GAM.html
模拟数据
install.packages("mgcv") #for gam package
require(mgcv)
install.packages("pspline")
require(pspline)
#simulated GAM data for example
dataSet <- gamSim(eg=1,n=400,dist="normal",scale=2)
visibility <- dataSet[[1]]
temperature <- dataSet[[2]]
dewpoint <- dataSet[[3]]
windspeed <- dataSet[[4]]
#Univariable GAM model
gamobj <- gam(visibility ~ s(dewpoint))
plot(gamobj, scale=0, page=1, shade = TRUE, all.terms=TRUE, cex.axis=1.5, cex.lab=1.5, main="Univariable Model: Dew Point")
summary(gamobj)
AIC(gamobj)
abline(h=0)
露点单变量模型 https://imgur.com/1uzP34F
ATTEMPT 2 -- 使用单变量模型预测函数,但不改变 y 轴
#dummy var that spans length of original covariate
maxDP <-max(dewpoint)
minDP <-min(dewpoint)
DPtrial.seq <-seq(minDP,maxDP,length=3071)
DPtrial.seq <-data.frame(dewpoint=DPtrial.seq)
#predict only the DP term
preds <- predict(gamobj, type="terms", newdata=DPtrial.seq, se.fit=TRUE)
#determine confidence intervals
DPplot <-DPtrial.seq$dewpoint
fit <-preds$fit
fit.up95 <-fit-1.96*preds$se.fit
fit.low95 <-fit+1.96*preds$se.fit
#plot
plot(DPplot, fit, lwd=3,
main="Reconstructed Dew Point Covariate Plot")
#plot confident intervals
polygon(c(DPplot, rev(DPplot)),
c(fit.low95,rev(fit.up95)), col="grey",
border=NA)
lines(DPplot, fit, lwd=2)
rug(dewpoint)
重构的露点协变量图 https://imgur.com/VS8QEcp
ATTEMPT 3 -- 使用“拟合”更改 y 轴,但不考虑截距
plot(dewpoint,fitted(gamobj), main="Fitted Response of Y (Visibility) Plotted Against Dew Point")
abline(h=mean(visibility))
rug(dewpoint)
Y 对露点绘制的拟合响应 https://imgur.com/RO0q6Vw
最终,我想要一条水平线,我可以在其中研究相对于 400 米的预测变量,而不仅仅是响应变量的平均值。这样,它将在平均可见度不同的多个站点之间具有可比性。最重要的是,它需要用于多个协变量!
Gavin Simpson 在几篇文章中解释了该方法,但不幸的是,我真的不明白在使用预测函数时如何保持其他协变量的平均值不变:
Changing the Y axis of default plot.gam graphs
对此方法的任何更深入的解释都会非常有帮助!!!
【问题讨论】:
-
我试图提供一个答案,但这需要你改变你的整个方法(我认为你应该使用
gam()而不是单独的单变量模型来做一个类似多元回归的模型)。但是假设您想这样做,那么我已经解释了如何在您预测关注一两个变量时保持一些协变量不变。 -
如果您想一次坚持使用一个单变量模型,那么我不明白为什么
predict(model, newdata, type = "response", se.fit = TRUE)不满足您的要求? (如果您实际上正在拟合非高斯模型,那么您需要type = "link"并计算然后反向变换拟合值和置信区间,如我在我的答案中所示)。 -
嗨 Gavin,非常感谢您的回复!我的意图绝对是使用 gam() 的多元回归模型,其中包含所有变量,而不是单独的变量。我只是在网上找不到任何做多的例子。很高兴现在尝试您的建议,看看我是否能解决。