Как интегрировать (AUC) модель NLS и доверительный интервал Монте-Карло в R - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь интегрировать (разрешить область под) нелинейную функцию (от nls()) от x = 0 до бесконечности в R. Однако функция интегрирования R вызывает функцию (f).

Короче говоря, я хотел бы сделать что-то приближенное:

integrate(my.nls, lower = 0L, upper = Inf)

Но, к сожалению, my.nls на самом деле является подобранным объектом модели, а не функцией.Я решил использовать сглаживающий сплайн для интерполяции, а затем интегрировать полученную функцию.Но я бы предпочел использовать истинную функцию NLS вместо приближения.Кроме того, учитывая бесконечную природу интегрирования, я должен быть очень осторожен с экстраполяцией в положительном направлении.

Если возможно, идеальным методом было бы уметь интегрировать результаты nls и других функций.Например, площадь под симулированным доверительным интервалом 97,5%, рассчитанная по функции predictNLS пакета распространения.

Я довольно новичок в R, и это только мой второй пост на SO, я думаю,поэтому, пожалуйста, прости меня, если это банальный или глупый вопрос или я совершил какой-то другой грех.Пока что неуместное использование as.function или function(){predict(my.nls()} никуда меня не привело, и я был бы очень признателен за любую помощь.

Ниже приведен краткий пример, который должен служить иллюстрацией моей проблемы:

### Make up some data
x <- seq(from = 10, to = 1, length.out = 15)+(rnorm(15)+2)
y <- seq(from = 1, to = 10, length.out = 15)+(rnorm(15)+2)

### Fit an nls model, in this case, just a plain linear one.
my.nls <- nls(y~m*x+b, start = c(m=-1, b=100))

### Get confidence intervals from propagate package, might take a couple 
#seconds to run. Only serves to illustrate the type of values, the 
#function of which, I'd like to integrate (see my.preds$summary)

library(propagate) 

my.preds <- predictNLS(my.nls, newdata = data.frame("x" = x))

### Integrate (totally not right, just (hopefully) illustrating 
#the idea of what I'd like to do)

#exact.fn.auc <- integrate(my.nls, lower = 0L, upper = Inf)
#upperCI.fn.auc <- integrate(predictNLS(my.nls)$summary$Sim.97.5%, lower = 0L, upper = Inf)

PS: я признаю, что синтаксис в последних двух строках очень неправильный, я просто пытаюсь показать, откуда будут взяты значения, представленные функцией, если бы они были вычислены отдельно.Если есть какие-либо вопросы относительно того, к чему я клоню, задайте их, и я попытаюсь перефразировать мою проблему.

PPS: Весьма вероятно, что я делаю это совершенно не в том направлении (хотятипы моделей, которые мне нужно подобрать, на самом деле являются нелинейными (в отличие от той, что проиллюстрирована выше), и я хотел бы получить область ниже средней функции и ее доверительные интервалы в некотором роде), если у вас есть какие-либо предложения относительно другихподходы, те приветствуются.Проблема, которую я имею со сплайнами, состоит в том, что мои истинные модели становятся асимптотическими при приближении к y = 0, и, учитывая, что я собираюсь перейти к Inf, небольшие аберрации в экстраполяции разрешают некоторые действительно очень разные значения под кривой.

1 Ответ

0 голосов
/ 14 февраля 2019

Основная проблема заключается в том, что integrate нужна функция, а это не то, что вы пытались предоставить.Другая проблема, по крайней мере в этом примере, заключается в том, что интеграл расходится при переходе к Inf.

Ограничение внимания на [0, 10], для первого случая мы имеем

integrate(function(p) 
  predict(my.nls, data.frame(x = p)),
  lower = 0, upper = 10)
# 102.0578 with absolute error < 1.1e-12

Во втором

integrate(function(p) 
  predictNLS(my.nls, newdata = data.frame(x = p), do.sim = FALSE)$summary$`Prop.97.5%`,
  lower = 0, upper = 10)
# 113.9549 with absolute error < 1.7e-06

, где я также добавил do.sim = FALSE, чтобы не использовать Монте-Карло, поскольку это занимает немного больше времени, но вы, конечно, можете настроить параметры (например, число МонтеКарло итераций nsim).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...