什么是R等效的matlab的csaps()

时间:2013-08-16 23:57:01

标签: r matlab splines

matlab中的

csaps()根据平滑参数p的特定定义执行三次样条。这是一些matlab代码及其结果:

     % x variable
    age = 75:99  

    % y variable
    diffs = [-39   -2 -167  -21  -13   32  -37 -132 -143  -91  -93  -88  -62 -112  -95  -28  -90  -40  -27  -23  -28  -11   -8   -6    1]

    % 0.0005 is the parameter p, and the later specification of 
    % age are the desired x for prediction
    csaps(age,diffs,0.0005,age)
    % result (column headers removed):
     -63.4604  -64.0474  -64.6171  -65.1397  -65.6111  -66.0165  -66.3114  
     -66.4123  -66.2229  -65.6726  -64.7244  -63.3582  -61.5676  -59.3568  
     -56.7364  -53.7382  -50.4086  -46.7922  -42.9439  -38.9183  -34.7629  
     -30.5180  -26.2186  -21.8912  -17.5532

我想在R中得到相同的结果。我尝试了base::smooth.spline(),但平滑参数spar以不同的方式指定,我似乎无法与matlab相关联p(可以?)。我能够获得的最接近的结果是使用smooth.Pspline()包的pspline函数。以下是一些在R中滚动的代码:

age <- 75:99
diffs <- c(-39L, -2L, -167L, -21L, -13L, 32L, -37L, -132L, -143L, -91L, 
-93L, -88L, -62L, -112L, -95L, -28L, -90L, -40L, -27L, -23L, 
-28L, -11L, -8L, -6L, 1L)
predict(pspline::smooth.Pspline(
                           x = age,
                           y = diffs, 
                           norder = 2, 
                           method = 1,
                           spar = 1 / 0.0005     # p given in MP and matlab as 0.0005
                         ),age)
# which gives something close, but not exactly the same:
 [1] -63.46487 -64.05103 -64.61978 -65.14158 -65.61214 -66.01662 -66.31079
 [8] -66.41092 -66.22081 -65.67009 -64.72153 -63.35514 -61.56447 -59.35372
[15] -56.73367 -53.73584 -50.40680 -46.79098 -42.94333 -38.91850 -34.76393
[22] -30.51985 -26.22131 -21.89474 -17.55757

csaps()帮助页面为here

可以找到<{smooth.spline()帮助here(代码没有给出,因为我认为sparp之间的关系可能非常毛茸茸,所以也许不值得这样做路径)

pspline::smooth.Pspline()帮助是here

other person's quest from 2008似乎没有得到答复,让我感觉像是this guy

R充满了样条函数,所以如果你们之间的saavy可以指向那个与matlab csaps()做同样事情的那个(或者沿着那些线条的伎俩),我会非常感激。

[编辑19-8-2013] spar需要指定为(1-p)/p(而不是1/p),然后结果将同意数值精度可以带你。见下面的答案。

2 个答案:

答案 0 :(得分:4)

我的同事找到答案:一个人将matlab的p转换为pspline::smooth.Pspline()的{​​{1}}而不是spar,而不是1/p,然后结果将同意数值精度的程度:

(1-p)/p

答案 1 :(得分:0)

这是我在p中找到的。 David Hiebeler撰写的MATLAB/R Reference中的16个。 [不过我不使用Matlab]。

将自然三次样条拟合(两个端点处的S''(x)= 0)到坐标为向量x和y的点(xi,yi);在x坐标在向量xx中的点进行求值,存储 相应的y在yy

Matlab:

pp=csape(x,y,’variational’);
yy=ppval(pp,xx) but note that
csape is in Matlab’s Spline
Toolbox

<强> - [R

tmp=spline(x,y,method=’natural’,
xout=xx); yy=tmp$y