关于gamm错误
这是一件非常有趣的事情……好吧,我应该先解释一下逻辑。
原则上,在 中固定平滑参数是非法的gamm,因为gamm会将平滑的摆动分量视为随机效应,其方差由lme(因为您有高斯数据)来估计。如果您尝试修复平滑参数,则本质上是说您要修复随机效应的方差。好吧,lme不允许你这样做(我怀疑这种尝试在混合建模中是否合法。)
因此gamm将禁用对平滑参数的任何可能约束,包括:
- 平滑参数的下限,通过
min.sp;
- 链接平滑共享相同的平滑参数,通过
idin s();
- 直接指定平滑参数 via
sp, via s()。
前两个已完美检查。gamm没有像;这样的min.sp论点 gam即使您通过 指定它...,也没有机会使用它(因为稍后它被NULL传递给gam.setupduring gamm.setup,因此您的指定min.sp被忽略)。id您看到的错误消息也会检测到规范,但您当然没有指定id,因此上述错误未在此处报告正确的问题,因此是一个错误。
第三个,其实并没有直接通过gamm。理想情况下,一旦(by )解释了gamm/gam公式,则应将其重置为(如果不是),并发出有关此的警告消息。然而,这部分是缺失的。因此,目前您能做的最好的事情就是不指定.interpret.gamsp-1sp
你有有效的模型嵌套吗?
现在让我们转向您对嵌套的关注。嵌套与基础设置有关,与平滑参数的选择无关。只要您具有相同的一组基础(相同的基础类型、相同的数量和/或“结”的位置),模型矩阵将是相同的。例如,在您的模型M0和中,您具有与defaultM1相同的配置。因此,您的两个模型中的设计矩阵相同。只是将此复制到您的主要模型中的所有级别。也许它不容易看到,但实际上你的嵌套在.s()mgcvbs = 'tp', k = 10s()by = factor(gender)s()genderM0M1M0
让我们考虑一个小例子来验证这一点。为简单起见,我不会使用s(x)from mgcv,而是使用poly(x, degree = 2)(想象它是s(x))。让我们首先生成一些玩具数据:
x <- 1:10
f <- gl(2, 5, labels = c("M", "F"))
由于f不是有序因子,因此通过对 的所有级别进行s(x, by = factor(f))复制来生成设计矩阵:s(x)f
## original design matrix for `s(x)`
X0 <- poly(x, 2)
## design matrix for `f`, without contrasting
Xf <- model.matrix(~ f + 0)
## design matrix for level `M`
X1 <- X0 * Xf[, 1]
## design matrix for level `F`
X2 <- X0 * Xf[, 2]
## design matrix for `s(x, by = f)` "please, imagine it as `poly`"
X <- cbind(X1, X2)
# 1 2 1 2
# [1,] -0.49543369 0.52223297 0.00000000 0.00000000
# [2,] -0.38533732 0.17407766 0.00000000 0.00000000
# [3,] -0.27524094 -0.08703883 0.00000000 0.00000000
# [4,] -0.16514456 -0.26111648 0.00000000 0.00000000
# [5,] -0.05504819 -0.34815531 0.00000000 0.00000000
# [6,] 0.00000000 0.00000000 0.05504819 -0.34815531
# [7,] 0.00000000 0.00000000 0.16514456 -0.26111648
# [8,] 0.00000000 0.00000000 0.27524094 -0.08703883
# [9,] 0.00000000 0.00000000 0.38533732 0.17407766
#[10,] 0.00000000 0.00000000 0.49543369 0.52223297
你的第二个模型M1,只有一个平滑项s(x),其设计矩阵是X0。
以下是我们如何看到您M1的嵌套在M0:
- As
X1 + X2 = X0,设计矩阵s(x)和s(x, by = f)具有相同的列跨度,因此s(x)嵌套在 中s(x, by = f);
- 因为
x嵌套在 中s(x),x:f所以嵌套在 中s(x, by = f)。
我会做什么
尽管您的模型已经很好地嵌套了,但主模型M0与您的M1. 您的主要模型M0最终将获得每个级别的独立平滑,而您则M1专注于两组之间的差异。
如果我们可以控制M0承认一种“参考平滑+差异平滑”的形式,那就太好了。然后,如果差异平滑变成一条线,在没有实际拟合的情况下,M1我们已经知道没有证据表明组之间存在非线性差异。
在mgcv中,如果您的因子是有序的,则将构建差分平滑。因此,我建议您通过以下方式拟合您的主要模型:
gender1 <- ordered(gender) ## create an ordered factor
s(x) + s(x, by = gender1) + gender
如果估计结果显示差异平滑s(x, by = gender1)为一条线,您知道您可以改为拟合更简单的模型
s(x) + gender:x + gender
即使不使用F-test.
by请注意,为了构建“差异”平滑,有一个有序因子非常重要。如果你这样做
s(x) + s(x, by = gender) + gender ## note, it is "gender" in "by"
s(x)并且s(x, by = gender)完全线性相关。生成的模型矩阵将是rank-deficient。
一些后续
s(x, by = as.factor(gender))我忘了在我的示例中包含我首先比较了与s(x) + s(x, by = gender)AIC参数化的相同模型(召回gender是 0-1 数值变量)。这些模型在统计上是等效的,但是在不同的情况下,平滑参数的估计显然不同,因此 AIC 略有不同。
哦是的。你gender是二进制的,所以数字by也是构建差分平滑的好主意。但请小心执行此操作。数值by不会产生居中平滑。因此,s(x) + s(x, by = gender)将隐含一个截距列,与模型截距相混淆。你应该去s(x) + s(x, by = gender) - 1。