关于gamm
错误
这是一件非常有趣的事情……好吧,我应该先解释一下逻辑。
原则上,在 中固定平滑参数是非法的gamm
,因为gamm
会将平滑的摆动分量视为随机效应,其方差由lme
(因为您有高斯数据)来估计。如果您尝试修复平滑参数,则本质上是说您要修复随机效应的方差。好吧,lme
不允许你这样做(我怀疑这种尝试在混合建模中是否合法。)
因此gamm
将禁用对平滑参数的任何可能约束,包括:
- 平滑参数的下限,通过
min.sp
;
- 链接平滑共享相同的平滑参数,通过
id
in s()
;
- 直接指定平滑参数 via
sp
, via s()
。
前两个已完美检查。gamm
没有像;这样的min.sp
论点 gam
即使您通过 指定它...
,也没有机会使用它(因为稍后它被NULL
传递给gam.setup
during gamm.setup
,因此您的指定min.sp
被忽略)。id
您看到的错误消息也会检测到规范,但您当然没有指定id
,因此上述错误未在此处报告正确的问题,因此是一个错误。
第三个,其实并没有直接通过gamm
。理想情况下,一旦(by )解释了gamm
/gam
公式,则应将其重置为(如果不是),并发出有关此的警告消息。然而,这部分是缺失的。因此,目前您能做的最好的事情就是不指定.interpret.gam
sp
-1
sp
你有有效的模型嵌套吗?
现在让我们转向您对嵌套的关注。嵌套与基础设置有关,与平滑参数的选择无关。只要您具有相同的一组基础(相同的基础类型、相同的数量和/或“结”的位置),模型矩阵将是相同的。例如,在您的模型M0
和中,您具有与defaultM1
相同的配置。因此,您的两个模型中的设计矩阵相同。只是将此复制到您的主要模型中的所有级别。也许它不容易看到,但实际上你的嵌套在.s()
mgcv
bs = 'tp', k = 10
s()
by = factor(gender)
s()
gender
M0
M1
M0
让我们考虑一个小例子来验证这一点。为简单起见,我不会使用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
。