Как в R подгонять модель с помощью nls (), используя модель, указанную функцией, параметры которой не передаются как одиночные скаляры? - PullRequest
0 голосов
/ 14 мая 2019

Как согласовать функцию staircase() с nls()?

Обратите внимание, что параметры модели, т.е. функции staircase(), представляют собой два вектора dx и dy, поэтому число параметров на самом деле length(dx)+length(dy);обратите внимание, что длина dx и dy должна быть одинаковой.

Количество значений параметров внутри dx и dy имеет порядок десятков, поэтому я не думаю, что целесообразно создавать прототип функции с таким количеством скалярных аргументов.

step_fn <- function(x, min = 0, max = 1) {

  y <- x
  y[x > min & x <= max] <- 1
  y[x <= min] <- 0
  y[x > max] <- 0

  return(y)
}

staircase <- function(x, dx, dy) {

  max <- cumsum(dx)
  min <- c(0, max[1:(length(dx)-1)])
  step <- cumsum(dy)

  purrr::reduce(purrr::pmap(list(min, max, step), ~ ..3 * step_fn(x, min = ..1, max = ..2)), `+`)
}

xvalues <- seq(0, 50, by = 0.01)

set.seed(42)
plot(
  x = xvalues,
  y = staircase(xvalues, dx = sample(1:5, 10, replace = TRUE), dy = sample(5:20, 10, replace = TRUE)),
  type = 'l', xlab = 'x', ylab = 'y'
)

...