2

ニューロ イメージング アプリケーションでは、R の最小二乗法によって多くの線形モデルを当てはめようとしています (への標準呼び出しlm)。計画行列 X があるとします。この計画行列は、すべてのモデルで同じになります。適合されるデータ (Y) が変化し、その結果、すべての適合パラメーター (ベータ、p 値、残差など) も変化します。

現在、私はそれを for ループに入れているだけなので、何十万回も呼び出しを行っていlmます。もっと良い方法が必要なようです。

最も計算コストの高い部分は逆行列だと思います。これは、lm.fit の Fortran 呼び出しで処理されるようです。

この回帰を手作業で行っていた場合、行列の反転を行い、それをさまざまなデータセットで乗算します。実際、正常に動作する計画行列 (すべての連続値共変量など) がある場合に、それを行う関数をコード化しました。lmただし、要素を適切に再コーディングするなど、すべての作業が本当に気に入っており、 の出力lmも非常に優れています。

とにかく私のケーキを食べて食べることはありますか?つまり、lm の親しみやすさを手に入れながら、その能力を使用して、同一の計画行列を持つ多くのモデルを計算的に効率的に適合させるにはどうすればよいでしょうか?

4

3 に答える 3

11

はい、もっと良い方法があります。fastLm()パッケージRcppArmadillo、RcppGSL、およびRcppEigenで、Armadillo、GSL、およびEigenの外部C /C++コードを使用した置換関数の例を作成しています。

モデル行列の設定と式の分解に最も多くの時間が費やされています。lm()のソース、またはおそらく私たちのソースを読んで、fastLm()この解析を1回だけ行う方法を確認できます。右側を維持してから、さまざまなyベクトルをループします。どのフィッティング関数を使用するかはそれほど重要ではありません。私fastLm()はRcppArmadilloが好きですが、ねえ、私もそれを書きました:)

于 2013-01-28T21:22:31.903 に答える
8

のヘルプページからlm

'response' が行列の場合、行列の各列に線形モデルが最小二乗法によって個別に当てはめられます。

したがって、単純なアプローチは、すべての異なる y ベクトルを行列に結合し、それを への 1 回の呼び出しで応答として渡すことlmです。例えば:

(fit <- lm( cbind(Sepal.Width,Sepal.Length) ~ Petal.Width+Petal.Length+Species, data=iris))
summary(fit)
summary(fit)[2]
coef(summary(fit)[2])
coef(summary(fit))[2]
sapply( summary(fit), function(x) x$r.squared )
于 2013-01-28T22:13:16.717 に答える
5

lm;を使用するより良い方法を知りません。ただし、 function の使用を検討することもできますlsfit。単純で付加機能が少ないですが、この構文では、応答変数の値を持つベクトルだけでなく、行列もlsfit(X,y)使用できます。y次に、 を 1 回呼び出して 、同じ計画行列で回帰することにより、lsfitのすべての列を当てはめます。非常に高速で便利です。yX

于 2013-01-28T21:07:03.517 に答える