我目前的问题是用R计算一般加性模型(GAM)的不同变量所解释的方差。
我按照Wood给出的解释: https://stat.ethz.ch/pipermail/r-help/2007-October/142743.html
但我想用三个变量来做。 我试过这个:
library(mgcv)
set.seed(0)
n<-400
x1 <- runif(n, 0, 1)
x2 <- runif(n, 0, 1)
x3 <- runif(n, 0, 1)
f1 <- function(x) exp(2 * x) - 3.75887
f2 <- function(x) 0.2*x^11*(10*(1-x))^6+10*(10*x)^3*(1-x)^10
f3 <- function(x) 0.008*x^2 - 1.8*x + 874
f <- f1(x1) + f2(x2) + f3(x3)
e <- rnorm(n, 0, 2)
y <- f + e
b <- gam(y ~ s(x1, k = 3)+s(x2, k = 3)+ s(x3, k = 3))
b3 <- gam(y ~ s(x1) + s(x2), sp = c(b$sp[1], b$sp[2]))
b2 <- gam(y ~ s(x1) + s(x3), sp = c(b$sp[1], b$sp[3]))
b1 <- gam(y ~ s(x2) + s(x3), sp = c(b$sp[2], b$sp[3]))
b0 <- gam(y~1)
(deviance(b1)-deviance(b))/deviance(b0)
(deviance(b2)-deviance(b))/deviance(b0)
(deviance(b3)-deviance(b))/deviance(b0)
但我不明白结果。例如,只有x1和x2的模型的偏差小于三个解释变量的偏差。
我用来提取由三个变量变量解释的方差的方法是否正确?
这是否意味着全球模型中存在混淆效应?还是有另一种解释?
非常感谢。
答案 0 :(得分:5)
你在这里做错了什么:
b <- gam(y ~ s(x1, k = 3) + s(x2, k = 3) + s(x3, k = 3))
b3 <- gam(y ~ s(x1) + s(x2), sp = c(b$sp[1], b$sp[2]))
b2 <- gam(y ~ s(x1) + s(x3), sp = c(b$sp[1], b$sp[3]))
b1 <- gam(y ~ s(x2) + s(x3), sp = c(b$sp[2], b$sp[3]))
为什么你在第一行设置了k = 3
,而没有为其余设置k = 3
?如果不指定k
,s()
将采用默认值k = 10
。现在您遇到了问题:b1
,b2
,b3
未嵌套在b
中。
在Simon Wood的原始示例中,他未指定k
,因此所有k=10
都会s()
。实际上,您可以改变k
值,但您必须保证对同一协变量始终具有相同的k
(以确保嵌套)。例如,你可以这样做:
b <- gam(y ~ s(x1, k = 4) + s(x2, k = 6) + s(x3, k = 3))
b3 <- gam(y ~ s(x1, k = 4) + s(x2, k = 6), sp = c(b$sp[1], b$sp[2])) ## droping s(x3) from b
b2 <- gam(y ~ s(x1, k = 4) + s(x3, k = 3), sp = c(b$sp[1], b$sp[3])) ## droping s(x2) from b
b1 <- gam(y ~ s(x2, k = 6) + s(x3, k = 3), sp = c(b$sp[2], b$sp[3])) ## droping s(x1) from b
然后让我们做:
(deviance(b1)-deviance(b))/deviance(b0)
# [1] 0.2073421
(deviance(b2)-deviance(b))/deviance(b0)
# [1] 0.4323154
(deviance(b3)-deviance(b))/deviance(b0)
# [1] 0.02094997
正值意味着放弃任何模型术语会使偏差膨胀,这是明智的,因为我们的真实模型具有所有三个术语。