Отобразить функцию над вектором - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть следующие x и y:

set.seed(1234)
x <- seq(1, 1000, 1)
y <- rnorm(1000)

И мне нужно смоделировать их, используя smooth.spline:

model <- smooth.spline(x, y, nknots = 10)

Проблема в том, что мне нужно подогнать эту модель, модифицируя nknots каждый раз. Вектор, обозначающий узлы, следующий:

myknots <- seq(5, 15, 1)

Я думал создать свою собственную функцию, например:

myfoo <- function(x, y, nknots){
  smooth.spline(x, y, nknots = nknots)
}

Но я не могу найти прямой способ сделать это. Я скорее использую пакет purrr. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Вы можете сделать это без необходимости загружать дополнительные пакеты и полагаться на них, чтобы они никогда не менялись, используя base :: Vectorize в одну строку:

> alls = Vectorize(smooth.spline,"nknots",SIMPLIFY=FALSE)(x=x,y=y,nknots=myknots)

Возвращает список, в котором каждый элементявляется smooth.spline выходным значением для каждого значения myknots:

> alls[[1]]
Call:
(function (x, y = NULL, w = NULL, df, spar = NULL, lambda = NULL, 
    cv = FALSE, all.knots = FALSE, nknots = .nknots.smspl, keep.data = TRUE, 
  ...

Smoothing Parameter  spar= 0.1318881  lambda= 0.01540768 (14 iterations)
Equivalent Degrees of Freedom (Df): 5.244268
Penalized Criterion (RSS): 984.4824
GCV: 0.99489
> alls[[2]]
Call:
(function (x, y = NULL, w = NULL, df, spar = NULL, lambda = NULL, 
    cv = FALSE, all.knots = FALSE, nknots = .nknots.smspl, keep.data = TRUE, 
  ...

Smoothing Parameter  spar= 0.2285265  lambda= 0.03658625 (12 iterations)
Equivalent Degrees of Freedom (Df): 5.006371
Penalized Criterion (RSS): 984.8108
GCV: 0.994746

Сохранение зависимостей до минимума является хорошей практикой.

0 голосов
/ 11 сентября 2018

С purrr мы используем map

library(purrr)
map(myknots,  ~ myfoo(x, y, nknots = .x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...