1

matlab スクリプトを R に変換しようとしていますが、スムージングに問題があります。

変換したいmatlabコードは次のとおりです。

for i = 1:size(spike_sum,2)
        smooth_sum(1:Ne,i)=smooth(double(spike_sum(1:Ne,i)),spanNe,'lowess');
end

for i = 1:Ne
        smoother_sum(i,:)=smooth(double(smooth_sum(i,:)),spanT,'lowess');
end

ここで、spike_sum は Ne x 4000 の行列です。最初に、Dim 1 で spanNe を使用して平滑化し、4000 スライスすべてに対してそれを行います。次に、Dim 2 でスパン spanT を使用してスムージングし、すべての Ne スライスに対してそれを行います。

R の lowess 関数を見てきましたが、lowess(x,y,span,iter,delta) として 2 次元を取るようです。上記のコードの結果を R で取得するには、行列の一部を y として取得し、x の定数値を複製するだけでよいでしょうか?

4

2 に答える 2

1

私のMatlabはかなりさびていますが、私があなたを正しく理解していれば、おそらくシーケンス1:Neまたは引数を1:4000に渡したいと思うでしょう。これは、平滑化するポイントのx座標であることを意味します。これは、ポイントが実際に等間隔であると想定していることを前提としています。xlowess

次のようなものが機能します。

#Example matrix
M <- matrix(runif(1600),40,40)

#Smooth rows; transpose when smoothing over rows
M1 <- t(apply(M,1,FUN = function(x){lowess(1:length(x),x)$y}))

#Smooth columns; but don't transpose; fills by column already
M2 <- apply(M1,2,FUN = function(x){lowess(1:length(x),x)$y})

さまざまなスパンは含めませんでしたが、それらの詳細を自分で追加できます。

編集

ああ、でも速度を求めるなら、おそらくloess.smooth直接使用する必要があります。loess式インターフェイスを使用するため、直接呼び出す必要がありますloess.smooth。ただし、デフォルトは とは異なるlowessため、注意してください。その機能を交換すると、実行時間がほぼ 1/4 短縮されます。

于 2011-10-12T21:10:57.050 に答える
0

まあ、joran によって提供された答えは意図したとおりに機能しませんでしたが、joran はそれをデバッグしようとしてかなりの時間を費やしましたが、私は感謝していますが、最終的にそのソリューションを機能させることができませんでした。ですが、matlab コードに匹敵する結果は得られませんでした。いじり回した後、この解決策を見つけました(これは最適ではないかもしれませんが、期待どおりに機能します)

loesscontrol=loess.control(surface="interpolate", statistics="approximate", trace.hat="exact", iterations=1)
spanNe=100/Ne
spanT=50/nsteps
spanNi=30/Ni

for (i in 1:nsteps){
        x<-1:Ne
        y<-spike_sum[1:Ne,i]
        smoothingNe<-loess.smooth(x, y, span=spanNe, degree=1, family="gaussian", evaluation=Ne)
        smooth_sumNe[1:Ne,i]<-smoothingNe$y
}

for (i in 1:Ne){
        x<-1:nsteps
        y<-smooth_sumNe[i,1:nsteps]
        smoothingT<-loess.smooth(x, y, span=spanT, degree=1, control=loesscontrol, family="gaussian", evaluation=nsteps)
        smoother_sumNe[i,1:nsteps]<-smoothingT$y        
}

ここで重要なことの 1 つは、最初の平滑化で評価 = Ne を設定することでした。そうしないと、結果が null になるからです。その理由はわかりませんが、おそらくデータがまばらで非常に不連続だったからでしょう。

于 2011-10-13T17:49:02.627 に答える