關於gamm
錯誤
這是一件非常有趣的事情......那麼,我應該首先解釋邏輯。
原則它是違法的gamm
修復平滑參數,因爲gamm
將把光滑如隨機效應的波浪組成部分,其中的差額通過lme
估計(你有高斯數據)。如果你試圖修正平滑參數,那實際上是說你想修正隨機效應的方差。那麼,lme
不允許你這樣做(我懷疑這種嘗試在混合建模中是否合法。)
因此gamm
將在平滑參數禁用任何可能的限制,其中包括:
- 下界平滑參數的,經由
min.sp
;
- 在
s()
連接平滑共享相同的平滑參數,經由id
;
- 直接指定經由
sp
平滑參數,經由s()
。
前兩個是完全檢查。 gamm
沒有min.sp
的說法,如gam
;即使你通過...
指定它,有沒有機會,它會習慣(如後面這是一個的過程中gamm.setup
傳遞到gam.setup
NULL
,所以你指定的min.sp
被忽略)。 id
的規格也會被你看到的錯誤信息檢測到,但是你當然沒有指定id
,所以上面的錯誤在這裏沒有報告正確的問題,因此是一個錯誤。
第三個,卻沒有被直接通過gamm
檢查。理想情況下,只要gamm
/gam
公式被解釋(通過interpret.gam
),sp
應重置爲-1
(如果不是很容易),並且應該發出關於此的警告消息。但是,這部分不見了。因此,目前你能做的最好的事情就是不指定sp
。
您是否有有效的模型嵌套?
現在讓我們談談您對嵌套的關注。 嵌套與基礎設置有關,而不是選擇平滑參數。只要您具有相同的基礎組(相同的基礎類型,相同的數字和/或「節點」的位置),模型矩陣將是相同的。例如,在你的模型M0
和M1
,你有s()
與mgcv
默認bs = 'tp', k = 10
相同的配置。所以s()
的設計矩陣在你的兩個模型中是相同的。 by = factor(gender)
只是將s()
複製到您的主要型號M0
中的各個級別gender
。也許它不容易看到,但實際上你的M1
嵌套在M0
。
讓我們考慮一個小例子來驗證這一點。爲了簡單起見,我不會使用從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
:
- 作爲
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
接受「參考平滑+差異平滑」的形式,那將是一件好事。然後,如果差異平滑發現一條線,而實際上沒有擬合,我們已經知道沒有證據表明組之間存在非線性差異。
在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)
是完全線性相關。得到的模型矩陣將是等級缺陷。
一些後續
忘在我的例子,我在第一比較參數化作爲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
。
sp不能在gamm中工作,只能在gam中使用? – ErrantBard