Что такое R-эквивалент csaps() в Matlab?

csaps() в Matlab выполняет кубический сплайн в соответствии с конкретным определением параметра сглаживания 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 указан по-другому, что я не могу связать с p Matlab (можете вы ?). Ближайший результат, который мне удалось получить, был с функцией 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() находится здесь

smooth.spline() справку можно найти здесь (код не указан, потому что я думаю, что связь между spar и p довольно туманна, поэтому, возможно, не стоит идти по этому пути)

pspline::smooth.Pspline() помощь находится здесь

Этот запрос другого человека из 2008 года, похоже, остался без ответа. , заставляя меня чувствовать себя этим парнем.

R переполнен сплайнами, поэтому, если сообразительные среди вас могут указать мне на тот, который делает то же самое, что и csaps() Matlab (или трюк в этом направлении), я был бы очень признателен.

[РЕДАКТИРОВАТЬ 19-8-2013] spar необходимо указать как (1-p)/p (а не 1/p), и тогда результаты будут согласовываться с точностью, насколько это возможно. Смотрите ответ ниже.


person tim riffe    schedule 16.08.2013    source источник
comment
У вас уже есть метод, который согласуется с точностью до 5 знаков после запятой (по соотношениям). Я не вижу смысла в попытках получить точное согласие с приближением к чему-то неопределенному.   -  person IRTFM    schedule 17.08.2013
comment
@DWin Это маленькая звездочка в большом Matlab - проект преобразования R некоторого устаревшего кода. От этого зависит множество вещей ниже по течению, и функция используется более одного раза в исходном коде. Для нас это важно, потому что последующие оценки должны быть точными, например, точными.   -  person tim riffe    schedule 17.08.2013
comment
Точный? Вы только что провели два сплайна через этот набор разбросанных точек. Как вы можете утверждать, что любой из них является точным?   -  person IRTFM    schedule 17.08.2013
comment
@DWin да, это похоже на рисование пальцами, я понимаю. Я не утверждаю, что они точно представляют данные. Мне нужно воспроизвести результат точно, а не точно найти истину. Задача не прихоть. Вопрос актуален. Если это не реализовано в R, я сделаю это, но я все равно поищу ответ, если смогу.   -  person tim riffe    schedule 17.08.2013
comment
Вы должны проверить, насколько чувствителен результат R к изменениям лонжерона.   -  person IRTFM    schedule 17.08.2013
comment
Если вам действительно необходимо получить идентичные значения, тогда edit csaps и посмотрите на код.   -  person horchler    schedule 17.08.2013
comment
спасибо DWin и horchler. Получил ответ - мне нужно было указать лонжерон по-другому   -  person tim riffe    schedule 19.08.2013


Ответы (2)


Мой коллега нашел ответ: можно преобразовать p Matlab в pspline::smooth.Pspline() spar не как 1/p, а как (1-p)/p, и тогда результаты согласуются с любой степенью числовой точности:

c(predict(pspline::smooth.Pspline(
                          x = age,
                          y = diffs, 
                          norder = 2, 
                          method = 1,
                          spar = (1-0.0005) / 0.0005     # p given in MP and matlab as 
                         ),age))
 [1] -63.46035 -64.04741 -64.61705 -65.13972 -65.61114 -66.01646 -66.31144
 [8] -66.41232 -66.22285 -65.67263 -64.72443 -63.35823 -61.56761 -59.35675
[15] -56.73643 -53.73821 -50.40864 -46.79221 -42.94387 -38.91828 -34.76291
[22] -30.51801 -26.21863 -21.89122 -17.55320
person tim riffe    schedule 19.08.2013

Вот что я нашел на стр. 16 из справочника по MATLAB/R Дэвида Хибелера. [Однако я не использую Matlab].

Подогнать натуральный кубический сплайн (S′′(x) = 0 на обоих концах) к точкам (xi, yi), координаты которых лежат в векторах x и y; оценить в точках, чьи координаты x находятся в векторе xx, сохраняя соответствующие y в yy

Matlab:

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

Р

tmp=spline(x,y,method=’natural’,
xout=xx); yy=tmp$y
person Metrics    schedule 17.08.2013
comment
Спасибо за попытку, но без костей. Пытаюсь воспроизвести csaps(). Я адаптировал ваш R-код (Хибелера) к моей проблеме, и он не помогает. - person tim riffe; 17.08.2013