gamm
エラーについて
これは非常に興味深いことです...まず、ロジックを説明する必要があります。
原則として、でスムージング パラメータを修正することは違法ですgamm
gamm
。これは、 がスムースの波状コンポーネントをランダム効果として扱い、その分散を推定するlme
ためです (ガウス データがある場合)。平滑化パラメーターを修正しようとすると、それは基本的に、ランダム効果の分散を修正したいということです。まあ、lme
これを行うことはできません (また、そのような試みが混合モデリングで合法であるかどうかも疑問です)。
したがってgamm
、次のようなスムージング パラメーターの制約をすべて無効にします。
- 平滑化パラメータの下限
min.sp
。
id
inを介して、同じスムージング パラメータを共有するリンクされたスムースs()
。
sp
、経由で直接指定された平滑化パラメータs()
。
最初の 2 つは完全にチェックされます。;のような引数gamm
はありません。経由で指定しても、使用される可能性はありません(後でduringに渡されるため、指定は無視されます)。の指定は、表示されたエラー メッセージによっても検出されますが、もちろん指定しなかったため、上記のエラーはここで正しい問題を報告していないため、バグです。min.sp
gam
...
NULL
gam.setup
gamm.setup
min.sp
id
id
3 番目のものは、実際には を介して直接チェックされていませんgamm
。理想的には、gamm
/gam
式が (によってinterpret.gam
)解釈されたらすぐに、そうでない場合はsp
にリセットし-1
、これに関する警告メッセージを発行する必要があります。ただし、この部分が欠けています。したがって、現時点でできる最善のことは、指定しないことsp
です。
有効なモデルのネストがありますか?
次に、ネスティングに関する懸念に目を向けましょう。ネスティングは、平滑化パラメーターの選択ではなく、基本設定に関連しています。基底のセットが同じである限り (基底の種類、「結び目」の数および/または位置が同じ)、モデル マトリックスは同じになります。たとえば、モデルM0
とでは、デフォルトのとM1
同じ構成になっています。したがって、 の計画行列は 2 つのモデルで同じです。はこれをメイン モデルのすべてのレベルに複製します。わかりにくいかもしれませんが、実際には にネストされています。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
2 番目のモデルには、計画行列が である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
. 2 つのグループの違いに焦点を当てながら、メイン モデル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)
、完全に線形従属です。結果のモデル マトリックスはランク落ちになります。
いくつかのフォローアップ
s(x, by = as.factor(gender))
最初に、AICと同じモデルをパラメーター化して比較したことを例に含めるのを忘れていましたs(x) + s(x, by = gender)
(リコールgender
は 0 ~ 1 の数値変数です)。これらのモデルは統計的に同等ですが、平滑化パラメーターはケースによって明らかに異なって推定されるため、AIC は少し異なります。
ああ、そうです。あなたgender
はバイナリなので、数値by
もスムーズな違いを構築するための良い考えです。しかし、これは慎重に行ってください。Numericalby
は、中央のスムーズを生成しません。したがって、s(x) + s(x, by = gender)
暗黙的に切片列があり、モデルの切片と混同されます。あなたは一緒に行くべきs(x) + s(x, by = gender) - 1
です。