оценить (т.е. предсказать) сглаживающий сплайн вне R

Я установил сглаживающий сплайн для данных в R с

library(splines)
Model <- smooth.spline(x, y, df =6) 

Я хотел бы взять подогнанный сплайн и оценить его для произвольных новых данных во внешнем коде (не в R). Другими словами, делать то, чтоpredict.smooth.spline функция делает. Я посмотрел наModel объект:

> str(Total_work_model)
List of 15
 $ x       : num [1:14] 0.0127 0.0186 0.0275 0.0343 0.0455 ...
 $ y       : num [1:14] 3174 3049 2887 2862 2975 ...
 $ w       : num [1:14] 1 1 1 1 1 1 1 1 1 1 ...
 $ yin     : num [1:14] 3173 3075 2857 2844 2984 ...
 $ data    :List of 3
  ..$ x: num [1:14] 0.0343 0.0455 0.0576 0.0697 0.0798 ...
  ..$ y: num [1:14] 2844 2984 3048 2805 2490 ...
  ..$ w: num [1:14] 1 1 1 1 1 1 1 1 1 1 ...
 $ lev     : num [1:14] 0.819 0.515 0.542 0.568 0.683 ...
 $ cv.crit : num 6494075
 $ pen.crit: num 3260
 $ crit    : num 3
 $ df      : num 8
 $ spar    : num 0.353
 $ lambda  : num 8.26e-05
 $ iparms  : Named int [1:3] 3 0 10
  ..- attr(*, "names")= chr [1:3] "icrit" "ispar" "iter"
 $ fit     :List of 5
  ..$ knot : num [1:20] 0 0 0 0 0.056 ...
  ..$ nk   : int 16
  ..$ min  : num 0.0127
  ..$ range: num 0.104
  ..$ coef : num [1:16] 3174 3132 3027 2871 2842 ...
  ..- attr(*, "class")= chr "smooth.spline.fit"
 $ call    : language smooth.spline(x = Phi00, y = Total, df = 8)
 - attr(*, "class")= chr "smooth.spline"

я думаюModel$fit$knot а такжеModel$fit$coef векторы содержат полное описание подгонки. Обратите внимание, что узлы 20, аx а такжеy у меня есть 14 элементов каждый: я всегда думал, что у сглаживающего сплайна будет столько узлов, сколько и точек привязки Однако, поскольку первые три и последние три узла идентичны, 20-6 = 14, что имеет смысл. Проблема в том, что я не знаю, как использоватьModel$fit$knot а такжеModel$fit$coef делать прогнозы за пределами R. Я пытался взглянуть наpredict.smooth.splineно удивительно вот что я получаю

> library(splines)
> predict.smooth.spline
Error: object 'predict.smooth.spline' not found

РЕДАКТИРОВАТЬ: так как, очевидно, некоторые пользователи неправильно поняли вопрос, я знаю, как использоватьpredictв R, чтобы получить новые значения моего сглаживающего сплайна. Проблема в том, что я хочу сделать эти прогнозы во внешнем коде. Таким образом, я хотел посмотреть на код для функцииpredict.smooth.spline, чтобы я мог попытаться воспроизвести алгоритм вне R. Обычно в R вы можете прочитать код функции, просто введя ее имя (без аргументов и без скобок) в приглашении R. Но когда я пытаюсь сделать это сpredict.smooth.splineЯ получаю вышеуказанную ошибку.

EDIT2: благодаря большой помощи @ r2evans, я нашел источник дляpredict методsmooth.spline, Я (кажется, я) понимаю большую часть этого:

> stats:::predict.smooth.spline.fit
function (object, x, deriv = 0, ...) 
{
    if (missing(x)) 
        x <- seq.int(from = object$min, to = object$min + object$range, 
            length.out = length(object$coef) - 4L)
    xs <- (x - object$min)/object$range
    extrap.left <- xs < 0
    extrap.right <- xs > 1
    interp <- !(extrap <- extrap.left | extrap.right)
    n <- sum(interp)
    y <- xs
    if (any(interp)) 
        y[interp] <- .Fortran(C_bvalus, n = as.integer(n), knot = as.double(object$knot), 
            coef = as.double(object$coef), nk = as.integer(object$nk), 
            x = as.double(xs[interp]), s = double(n), order = as.integer(deriv))$s
    if (any(extrap)) {
        xrange <- c(object$min, object$min + object$range)
        if (deriv == 0) {
            end.object <- Recall(object, xrange)$y
            end.slopes <- Recall(object, xrange, 1)$y * object$range
            if (any(extrap.left)) 
                y[extrap.left] <- end.object[1L] + end.slopes[1L] * 
                  (xs[extrap.left] - 0)
            if (any(extrap.right)) 
                y[extrap.right] <- end.object[2L] + end.slopes[2L] * 
                  (xs[extrap.right] - 1)
        }
        else if (deriv == 1) {
            end.slopes <- Recall(object, xrange, 1)$y * object$range
            y[extrap.left] <- end.slopes[1L]
            y[extrap.right] <- end.slopes[2L]
        }
        else y[extrap] <- 0
    }
    if (deriv > 0) 
        y <- y/(object$range^deriv)
    list(x = x, y = y)
}

Однако у меня есть две трудности:

.Fortran() функция вызывает подпрограмму Fortranbvalus чьяисточник это довольно просто. Тем не мение,bvalus по очереди звонкиbvalue что гораздо большесложнои звонкиinterv чей источник я не могу найти. Плохие новости:bvalue это слишком сложно для меня, чтобы понять (я определенно не эксперт Фортран). Хорошие новости: внешний код, который должен воспроизводитьpredict.smooth.spline.fit это также код Fortran. Если хуже становится хуже, я мог бы просто попросить моего коллегу указать источник изbvalus а такжеbvalue в своем коде. Однако, даже в этом, по общему признанию, не очень хорошем сценарии, я все еще пропустил бы исходный код дляinterv (Я надеюсь, что это не называет что-то еще !!!).

Я не понимаю, что здесь делается (заметьте, меня интересует толькоderiv == 0 дело):

k

  if (any(extrap)) {
        xrange <- c(object$min, object$min + object$range)
        if (deriv == 0) {
            end.object <- Recall(object, xrange)$y
            end.slopes <- Recall(object, xrange, 1)$y * object$range
            if (any(extrap.left)) 
                y[extrap.left] <- end.object[1L] + end.slopes[1L] * 
                  (xs[extrap.left] - 0)
            if (any(extrap.right)) 
                y[extrap.right] <- end.object[2L] + end.slopes[2L] * 
                  (xs[extrap.right] - 1)
        }

Какой-то рекурсивный код? Любая помощь здесь?

Ответы на вопрос(2)

Ваш ответ на вопрос