GAMに相互作用用語を含める方法


24

次のコードは、2つの時系列間の類似性を評価します。

set.seed(10)
RandData <- rnorm(8760*2)
America <- rep(c('NewYork','Miami'),each=8760)

Date = seq(from=as.POSIXct("1991-01-01 00:00"), 
           to=as.POSIXct("1991-12-31 23:00"), length=8760)

DatNew <- data.frame(Loc = America,
                     Doy = as.numeric(format(Date,format = "%j")),
                     Tod = as.numeric(format(Date,format = "%H")),
                     Temp = RandData,
                     DecTime = rep(seq(1, length(RandData)/2) / (length(RandData)/2),
                                   2))
require(mgcv)
mod1 <- gam(Temp ~ Loc + s(Doy) + s(Doy,by = Loc) +
  s(Tod) + s(Tod,by = Loc),data = DatNew, method = "ML")

ここでgamは、ニューヨークとマイアミの気温が1日の異なる時間での(両方の場所の)平均気温とどのように異なるかを評価するために使用されます。私が今抱えている問題は、各場所の温度が1年の異なる日に1日を通してどのように変化するかを示す相互作用用語を含める必要があることです。最終的には、これらの情報すべてを1つのグラフに(場所ごとに)表示したいと考えています。したがって、マイアミについては、温度が1日のさまざまな時期と1年のさまざまな時期の平均からどのように変化するかを示す1つのグラフを作成したいと考えています(3Dプロット?)


2
この質問への答えはstats.stackexchange.com/questions/18937 / ...に該当する場合があります。
jbowman

回答:


18

「gam」の「a」は「additive」を意味し、相互作用がないことを意味します。したがって、相互作用に適合する場合、実際にはもはやgamモデルに適合していません。

とは言っても、GAMの加法用語内の用語のような相互作用を得る方法があります。すでにのby引数を使用して、それらの1つを使用していますs。これを拡張して、引数byがdoyまたはtodの関数(sin、cos)を持つ行列になるようにすることができます。また、相互作用を許可する通常の線形モデルにスムージングスプラインを適合させることもできます(これにより、gamのようにバックフィッティングは行われませんが、それでも有用です)。

投影追跡回帰を別のフィッティングツールとして見ることもできます。黄土またはより多くのパラメトリックモデル(sinおよび/またはcosを使用)も有用です。

どのツールを使用するかの決定の一部は、あなたが答えようとしている質問です。将来の日付と時刻を予測するモデルを見つけようとしていますか?特定の予測変数がモデルで重要であるかどうかを確認するためにテストしようとしていますか?予測子と結果の間の関係の形を理解しようとしていますか?他に何か?


3
あなたは2つの予測変数があるとありません-まだGAMの?これはある意味で「相互作用」と考えることができます。また、このパッケージを使用すると、(引数が何をしているのかようなモデルを近似できると思います。それはまだゲームですか?、Y = F 1X 1+ F 2X 2+ F 3X 1 X 2+ ε Y = F 1X 1+ F 2X 2+ F 3x 1x 2 + f 4x 2x1,x2
y=f1(x1)+f2(x2)+f3(x1x2)+ε
gam
y=f1(x1)+f2(x2)+f3(x1)x2+f4(x2)x1+ε
by
マクロ

1
@Macro、髪を分割するかどうかによって異なります(技術的には、実際にはg部分を使用していないので、書いたものは多分です)。
グレッグスノー

2
@Macro、私はこの件に関してもっと言われていると思いますが、このVenableの記事、Exegeses on Linear ModelsのGAMの4ページを参照してください。非加法性の主効果と相互作用効果が同時に識別される方法は明確ではありません。
アンディW

コメントありがとうございます。ここでの私の主な目的は、将来の値を予測することではなく、各時系列が両方の系列の平均からどのように変化するかを単純に確認することです。たとえば、mod1の結果は、各場所の時系列が、最初に年の時間スケール(Doy)、次に時刻(Tod)の平均からどのように変化するかを示しています。これから、各シリーズがDoyとTodの関数でどのように変化するかを見てみたいと思います。これは、夏の期間中に時系列が大きく異なると予想しています。
KatyB

2
@AndyW VenableがGAMにコメントして以来、GAMは長い道のりを歩んでいることに注意することが重要です-過去10年ほどでのペナルティスプラインsensu Simon Wood(mgcvで実装されているように)と滑らかさの選択、相互作用、およびそれらを近似モデルフレームワークでマージする方法(限界ベースのテンソル積)。前者の例に概説されているように、GAM に対するVenable&Coxの異議は、GAM理論の最近の発展によって大部分が対処されていると確信しています。
モニカの復活-G.シンプソン

25

2つの連続変数の場合、以下を使用して、(これが相互作用であるかどうかに関係なく、@ Gregの回答に対するコメントに従って他の人に話し合うことを許可します)

mod1 <- gam(Temp ~ Loc + s(Doy, bs = "cc", k = 5) + 
                         s(Doy, bs = "cc", by = Loc, k = 5, m = 1) + 
                         s(Tod, bs = "cc", k = 5) + 
                         s(Tod, bs = "cc", by = Loc, k = 5, m = 1) +
                         te(Tod, Doy, by = Loc, bs = rep("cc",2)),
            data = DatNew, method = "ML")

次に、上記のより複雑なモデル内に、より単純なモデルをネストする必要があります。その単純なモデルは次のとおりです。

mod0 <- gam(Temp ~ Loc + s(Doy, bs = "cc", k = 5) + 
                         s(Doy, bs = "cc", by = Loc, k = 5, m = 1) + 
                         s(Tod, bs = "cc", k = 5) + 
                         s(Tod, bs = "cc", by = Loc, k = 5, m = 1),
            data = DatNew, method = "ML")

ここで2つのことに注意してください。

  1. 各スムーザーの基本タイプが記載されています。この場合、23:59から00:00のTodDoy == 1、およびの間にもTempに不連続性がないことが予想されDoy == 365.25ます。したがって、サイクリックスプラインスプラインが適切bs = "cc"です。
  2. 基本次元は明示的に記述されます(k = 5)。これは、te()用語の各スムーズのデフォルトの基本次元と一致します。

これらの機能を組み合わせることで、より単純なモデルがより複雑なモデル内に実際にネストされます。

詳細については?gam.modelsmgcvを参照してください


2番目のポイントに関連して-の指定に加えて、kノットの数も修正する必要があります(例:)fx=TRUE。そうでない場合、結果のモデルはedf用語ごとに変化することを示します。
ボックス内のマーク

限界ベースのスプラインに関してmgcvパッケージのいくつかの新しい機能を考慮して、この回答を少し更新する必要があります。とはいえ、スプラインの自由度を修正する必要があることに同意しません。重要なのは、モデルのベースが適切にネストされていることを確認することです。次に、非スプライン項を含む線形モデルで発生するように、基底関数の係数の一部をゼロに設定することにより、モデル間の差異が可能になります。
モニカの復活-G.シンプソン

3
誰かがまだこのスレッドを見ていて、答えてくれることを願っています。これらのモデルではs(Doy...)s(Doy, by =Loc...)なぜとの両方を指定する必要がありますか?前者は後者に入れ子になり、指定する必要がないと思いましたか?
自我_

3
いいえ、最初のスムースはグローバル関数であり、by smoothはそれとグローバルスムースとの間のサイト固有の違いを表します。m = 1ただし、差の平滑化の1次導関数にペナルティを課すには、平滑化を実際に追加する必要があります。
モニカの復職-G.シンプソン

2
@JoshuaRosenbergというのte()は、テンソル積に何を含めるかによって異なりますか?ここで説明する相互作用は、因子と滑らかな相互作用ですが、te()2つ以上の連続変数を意味します。グローバルな用語と主題固有の偏差が必要な場合は、はい、te(DoY, Year, by = Loc, m = 1)一緒te(DoY, Year)に使用できますが、ランダム効果のような因子平滑化相互作用とte()ランダム効果スプラインを含む用語を使用して同様のことを達成する他の方法があります。
モニカの復活-G.シンプソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.