2016-11-24 11 views
2

bam関数を使用して複数のデータセットに同じ一般化加算モデルをフィッティングしています(mgcv)。私のデータセットのほとんどは、合理的な時間内に10分から20分以内に完了します。いくつかのデータセットでは、実行には10時間以上かかります。私は遅いケース間で類似点を見つけることはできません。最終フィットは例外的に良いものも悪いものでもないし、顕著な異常値も含まれていません。いくつかのデータでmgcvのbamが遅いのはなぜですか?

このような場合、フィットが非常に遅いのはなぜわかりますか?そして、どうすればこれらのスピードを上げることができますか?

私のモデルには、2つの滑らかな項(周期的な3次スプライン基底を使用)といくつかの追加の数値と係数変数が含まれています。合計300の係数(滑らかな項の係数を含む)が推定される。フィッティングプロセスを高速化するために、情報の下に意図的に結び目の数を理論的に最適な数に保ちます。私のデータセットは約850kの行を含んでいます。

これは、関数呼び出しです:

bam(
    value 
    ~ 0 
    + weekday_x 
    + weekday 
    + time 
    + "a couple of factor variables encoding special events" 
    + delta:weekday 
    + s(share_of_year, k=length(knotsYear), bs="cc") 
    + s(share_of_year_x, k=length(knotsYear), bs="cc") 
    , knots=list(
     share_of_year=knotsYear 
     , share_of_year_x=knotsYear 
    ) 
    , family=quasipoisson() 
    , data=data 
) 

knotsYearsは26ノットが含まれています。

このモデルは、ほとんどの場合はかなり高速に収束しますが、少数の場合は非常に遅くなります。

答えて

5

A、最も可能性の高い原因:「fREML」失敗

上記のような典型的なモデルでは、テンソルスムーズteまたはtiせずに、私の経験ではREML反復がいくつかのケースで失敗したということです。

標準bamの実装では、fast.REML.fitが使用されます。このルーチンのコンバージェンステストには修正が必要ですが、Simonが移動して今度はdiscreteメソッドに重点を置いているので、彼はそれを修正することに熱心ではありません。固定版は(現時点では)私の博士論文に補足された "Zheyuan add-on"というテスト用の拡張パックでのみ利用可能です。しかしfast.REML.fitもそれほど脆弱ではなく、このようなコンバージェンスの失敗はしばしばありません。そうでなければ、大きなレポートの山は2012年にこの問題を解決します。

以下は、あなたが修正をチェックするのに役立ちます。

fitを10時間かかります。fit$outer.infoにチェックしてください。これは、REML反復の回数と、勾配やヘッセ行列のような収束情報を与えます。 iter = 200、または「失敗しました」のような何らかのエラーを示す情報が表示された場合、その時間がかかる理由が分かります。しかし、グラデーションを見ると、ほとんどゼロに近いことがわかります。言い換えれば、REML反復は実際には収束しましたが、fast.REML.fitはそれを検出できません。


別のチェック:「パフォーマンス・反復」

あなたがGAMないAM(ガウス応答を有する添加モデル)に当てはめているので、別のP-IRLSが(反復再秤量した最小二乗を献上されます) REML反復の外側にあります。はい、全体(標準)bam推定は、 "パフォーマンス反復"と呼ばれるダブルループネストです。これも失敗する可能性がありますが、このような障害は本質的であり、「パフォーマンスの反復」が収束することが保証されていないため、克服できません。だから、fit$iterをチェックして、それが非常に大きいかどうかを確認します(最悪の場合は200になる可能性があります)。 mgcvマニュアルには、このタイプのコンバージェンス障害について説明する専用のセクション?gam.convergenceがあり、「外側の反復」が望ましい理由があります。しかし、大規模なデータセットの場合、「外部反復」は実装するには高価です。だから、 "パフォーマンスの反復"に耐えます。

mgcvには「トレース」オプションがあります。 bamを呼び出すときにcontrol = gam.control(trace = TRUE)と設定すると、「パフォーマンスの繰り返し」が行われるため、逸脱情報と繰り返しカウンタが画面に表示されます。これにより、罰則の逸脱の明確な道筋が得られます。そのため、自転車に乗っているのか、ある時点でトラップしているのかを調べることができます。これは、fit$iterに格納されている1つの反復番号よりも有益です。


おそらく新しい方法をお試しください。

discrete = TRUE(2015年に追加、2017年に正式に発行された論文)を試してみたいと思うかもしれません。新しいフィッティング反復を使用します。従来の方法に比べて、実用的なコンバージェンス能力をテストするのは嬉しいです(沢山)。それを使用するときは、 "トレース"もオンにしてください。それが収束しない場合は、それを報告することを考えてください。しかし、再現可能なケースが必要です。

関連する問題