Что такое R-эквивалент для csaps()
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
указано по-другому, что я не могу относиться к Matlab's 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() находится здесь
smooth.spline()
помощь можно найти здесь (код не приводится, потому что я думаю, может быть, связь между spar
а также p
довольно волосатая, так что, возможно, не стоит идти по этому пути)
pspline::smooth.Pspline()
помощь здесь
Похоже, что квест этого другого человека с 2008 года остался без ответа, и я чувствую себя как этот парень.
R переполнен сплайн-делами, так что если вы попадаете в парусов, вы можете указать мне на тот, который делает то же самое, что и Matlab csaps()
(или трюк в том же духе) Я был бы очень благодарен.
[РЕДАКТИРОВАТЬ 19-8-2013] spar
должен быть указан как (1-p)/p
(скорее, чем 1/p
), а затем результаты согласятся с тем, насколько вы можете использовать числовую точность. Смотрите ответ ниже.
2 ответа
Мой коллега нашел ответ: один конвертирует Matlab's p
в pspline::smooth.Pspline()
"s 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
Вот что я нашел в с. 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