R 用lowess平滑

R 用lowess平滑,r,matlab,smoothing,R,Matlab,Smoothing,我正在尝试将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');

我正在尝试将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。我想先用span扳手在Dim 1中进行平滑,然后对所有4000个切片进行平滑。然后,我想用span spanT在Dim 2中进行平滑处理,并对所有Ne切片进行平滑处理


我已经研究了R中的lowess函数,但它似乎在二维中是lowess(x,y,span,iter,delta)。所以为了得到上面R中代码的结果,我是否只需要对y取一个矩阵切片,然后对x复制一个常量值

我的Matlab非常生锈,但是如果我理解正确,您可能希望将
1:Ne
1:4000
x
参数的序列传递到
lowess
,因为这意味着要平滑的点的x坐标。这假设您假设您的点确实是等间距的

类似这样的方法会奏效:

#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})
#示例矩阵

M我的Matlab非常生锈,但如果我理解正确,您可能希望将
1:Ne
1:4000
x
参数的序列传递到
lowess
,因为这意味着要平滑的点的x坐标。这假设您假设您的点确实是等间距的

类似这样的方法会奏效:

#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})
#示例矩阵

M好吧,虽然joran提供的答案没有按预期工作,joran花了相当多的时间尝试调试它,我很感激,但最终我无法使该解决方案工作,我真的不知道为什么,但它产生的结果无法与matlab代码相比。在胡思乱想之后,我发现了这个解决方案(这可能不是最优的,但效果正如预期的那样)

loesscontrol=leuch.control(surface=“interpolate”、statistics=“approximate”、trace.hat=“exact”、iterations=1)
扳手=100/Ne
spanT=50/nsteps
spanNi=30/Ni
对于(1:nsteps中的i){

x好吧,虽然joran提供的答案没有达到预期效果,joran花了相当多的时间尝试调试它,我很感激,但最终我无法使该解决方案起作用,我也不知道为什么,但它产生的结果无法与matlab代码相媲美。在混乱之后,我发现了这个解决方案(这可能不是最佳方案,但效果与预期一致)

loesscontrol=leuch.control(surface=“interpolate”、statistics=“approximate”、trace.hat=“exact”、iterations=1)
扳手=100/Ne
spanT=50/nsteps
spanNi=30/Ni
对于(1:nsteps中的i){

xHmm,我正在尝试测试它,但这只是一些事情。首先,M2将基于M1,而不是m,因为我想第二次平滑已经平滑的数据,但这次是在另一个维度。我继续并改变了它。第二,这似乎翻转了第一个矩阵的维度,因此接下来的两个矩阵是NxM inst我不知道任何R(我通常使用matlab),所以我不确定是什么设置,在matlab中,它可以简单地用“运算符”来修复,即使用
t()在R中转置矩阵
。我主要是想给你一个解决方案的原始成分,因为正如我所说,我的Matlab真的生锈了,所以我不会擅长翻译。我将编辑此内容以满足你的注释。此外,这似乎是等效Matlab代码的两倍(30秒vs 1分钟)这是一个很糟糕的问题,因为我每天需要运行几千次。我想知道为什么。是的,我没有抱怨,只是在测试它以验证解决方案时遇到了困难。谢谢,我会再试一次。@CHP查看我的编辑;我应该提到
lowess
在R中有点“旧”。大多数人使用
lowess
现在(或者在您的情况下,
lowess.smooth
lowess获得相同的输出)它应该快一点。嗯,我正试着测试它,但这只是几个问题。首先,M2将基于M1,而不是m,因为我想第二次平滑已经平滑的数据,但这次是在另一个维度。我继续并改变了它。第二,这似乎翻转了第一个矩阵的维度,所以t接下来的两个矩阵是NxM而不是MxN。我不知道任何R(我通常使用matlab),所以我不确定是什么设置,在matlab中,它可以简单地用“运算符”来固定,即使用
t()在R中转置矩阵
。我主要是想给你一个解决方案的原始成分,因为正如我所说,我的Matlab真的生锈了,所以我不会擅长翻译。我将编辑此内容以满足你的注释。此外,这似乎是等效Matlab代码的两倍(30秒vs 1分钟)这是一个很糟糕的问题,因为我每天需要运行几千次。我想知道为什么。是的,我没有抱怨,只是在测试它以验证解决方案时遇到了困难。谢谢,我会再试一次。@CHP查看我的编辑;我应该提到
lowess
在R中有点“旧”。大多数人使用
lowess
现在(或者在您的情况下,
lowess.smooth
,以在
lowess
获得相同的输出)。它应该会快一点。