Ошибка при подгонке ограниченной кривой через указанные c точки с использованием пакета cobs: NA / NaN / Inf при вызове сторонней функции - PullRequest
4 голосов
/ 22 января 2020

Я пытаюсь найти наиболее подходящую кривую через заданный набор точек. Установленная кривая также должна проходить через эти точки. Я нашел ответ на Cross Validated, в котором предлагалось использовать пакет cobs: Constrained B-Splines (Sparse Matrix Based). Тем не менее, я получил ошибку при тестировании с моими примерами данных:

Error in x %*% coefficients: NA/NaN/Inf in foreign function call (arg 2)  

Мой вопрос : что вызвало эту ошибку и как ее исправить? Я открыт для других решений, использующих другие методы / пакеты тоже. Спасибо!

library(cobs)

dat <- data.frame(
  x = c(1e-06,0.25,0.5,0.75,1,2,3,4,5,6),
  y = c(1e-07,1.925,2.9625,3.469375,
        3.875,4.5315,4.89,5.09375,5.216,5.46))
dat
#>          x         y
#> 1  1.0e-06 0.0000001
#> 2  2.5e-01 1.9250000
#> 3  5.0e-01 2.9625000
#> 4  7.5e-01 3.4693750
#> 5  1.0e+00 3.8750000
#> 6  2.0e+00 4.5315000
#> 7  3.0e+00 4.8900000
#> 8  4.0e+00 5.0937500
#> 9  5.0e+00 5.2160000
#> 10 6.0e+00 5.4600000

# visual inspection
plot(dat); lines(dat)

# define constrained points
con <- matrix(
  cbind(c(0,0,0,0,0,0,0,0,0,0),
        c(1e-06,0.25,0.5,0.75,1,2,3, 4,5,6),
        c(1e-07,1.925,2.9625,3.469375,
          3.875,4.5315,4.89,5.09375,5.216, 5.46)), 
  ncol = 3, nrow = 10)

# curve fitting 
fit_result <- cobs(dat$x, dat$y, pointwise = con)
#> qbsks2():
#>  Performing general knot selection ...
#> Error in x %*% coefficients: NA/NaN/Inf in foreign function call (arg 2)

Создано в 2020-01-21 пакетом Представить (v0.3.0)

Ответы [ 2 ]

3 голосов
/ 23 января 2020

Ваша проблема звучит как «Сплайн-интерполяция».

Возможно, самое простое решение в R:

> f = splinefun (dat$x, dat$y)

> #simple plot
> x = seq (0, 6,, 200)
> plot (dat)
> lines (x, f (x) )

Я отмечаю, что существуют различные типы подгонки кривой. Например, в регрессионном моделировании часто цель состоит в том, чтобы найти линию или плоскость (которая обобщает поверхность), которая дает наилучшее соответствие. Подгонка сплайнов и регрессионное моделирование не всегда выполняются по отдельности, поскольку в некоторых случаях сплайны используются для целей регрессии.

Примечание: я опубликовал справку R, и меня попросили опубликовать здесь.

2 голосов
/ 24 января 2020

Примечание: Я ответил на этот вопрос на R-Help , и ОП попросил меня также ответить на SO.

Решение состоит в том, чтобы явно установить тип constraint и выбрать значение для lambda. В заключительном письме ОП дает дополнительную информацию о том, как соответствовать кривой.

library(cobs)

dat <- data.frame(
  x = c(1e-06,0.25,0.5,0.75,1,2,3,4,5,6),
  y = c(1e-07,1.925,2.9625,3.469375,
        3.875,4.5315,4.89,5.09375,5.216,5.46))

con <- matrix(
  cbind(c(0,0,0,0,0,0,0,0,0,0),
        c(1e-06,0.25,0.5,0.75,1,2,3, 4,5,6),
        c(1e-07,1.925,2.9625,3.469375,
          3.875,4.5315,4.89,5.09375,5.216, 5.46)),
  ncol = 3, nrow = 10)

# curve fitting
fit_result <- cobs(dat$x, dat$y,
                   constraint = "increase",
                   lambda = 0.1,
                   pointwise = con)

pred <- predict(fit_result)

plot(y~x, dat)
lines(pred[,1], pred[,2], col = "red")

enter image description here

...