私の質問は数年前のものであり、最終的に私にとって最適なソリューションを追加したいと考えています。
まず、私の質問で説明されているように、mgcv を使用してモデルを適合させることは不可能です。
しばらくの間、私は 2 段階のプロセスを使用しました。
model1 = gam(
y ~ s(day_in_year, k=52, bs='cc')
+ s(day_in_year, k=52, bs='cc')
+ as.factor(day_in_week)
, knots=list(
day_in_year=c(0, 366)
, day_in_week=c(0,7)
)
, data = data
)
# get_weekday_offset gets the coefficients for each weekday and normalizes them to have mean 0
data$weekday_offset = get_weekday_offset(model1)[data$day_in_week]
model2 = gam(
y ~ s(day_in_year, k=52, bs='cc')
+ s(day_in_year, k=52, bs='cc')
+ s(day_in_year, k=52, bs='cc', by=weekday_offset)
+ as.factor(day_in_week)
, knots=list(
day_in_year=c(0, 366)
, day_in_week=c(0,7)
)
, data = data
)
2 番目のモデルの形式は「y ~ f(年内の日) + g(年内の日) * h(曜日)」ですが、h は固定関数であり、2 番目のモデルのデータには当てはまりません。に最適model1
です。これの明らかな欠点は、mgcv を 2 回実行する必要があり、最初の実行からのほぼすべての情報 (平日の係数を除く) が破棄されることです。
最終的にこのモデルを断念したのは、振幅の変化だけでなく、形状にも年々変化があったため、最終的にこのような外観に落ち着いたからです。
gam(
y ~ s(day_in_year, k=52, bs='cc')
+ s(day_in_year, k=10, bs='cc', by=as.factor(day_in_week)
+ as.factor(day_in_week)
, knots=list(
day_in_year=c(0, 366)
, day_in_week=c(0,7)
)
, data = data
)
週次パターンの自由度を最大にしてデータを正当化したので、平日の を削除しs
、平日と年間通算日の交互作用効果を追加しました ( s(day_in_year, k=12, bs='cc', by=as.factor(day_in_week)
)。これにより、別の季節性曲線が推定されます。ただし、季節項よりも自由度が大幅に低いため、項s(day_in_year, k=52, bs='cc')
を試すときに発生した問題には遭遇しませんte
。