Я создаю пакет, который:
- читать в наборе данных
- определить, какие компоненты необходимы для моделирования данных 1
- построить самозапускающуюся модель NLS, используя эти компоненты
- применить эту модель к данным
Результат сохраняется в списке, который содержит данные, модель и результат nls. Все работает до шага 4. Я сохранил свои построенные модели в списке, и R больше не распознает их как функции selfStart.
Вот игрушечный пример, иллюстрирующий мою проблему. Следующая функция (из руководства SSlogis
) отлично работает на верхнем уровне:
Chick.1 <- ChickWeight[ChickWeight$Chick == 1, ]
fm1 <- nls(weight ~ SSlogis(Time, Asym, xmid, scal), data = Chick.1)
fm1
Модель нелинейной регрессии
model: weight ~ SSlogis (Time, Asym, xmid, scal) data: Chick.1
Asym xmid scal
937.02 35.22 11.41
остаточная сумма квадратов: 76.66Количество итераций до сходимости: 0
Достигнутый допуск сходимости: 7.778e-07
Но когда я сохраняю функцию и данные вместе в списке, R больше не видит самозапускающуюся функцию как самозапускающуюся:
myobj <- list()
myobj$model <- SSlogis
myobj$data <- ChickWeight[ChickWeight$Chick == 1, ]
nls(weight ~ myobj$model(Time, Asym, xmid, scal), data = myobj$data)
Ошибка в getInitial.default (func, data, mCall = as.list (match.call (func,:
) для объектов «функция» не найден метод getInitial.
Мой рабочий процесс в конечном итоге будет включать обработку десятков наборов данных, поэтому я хотел бы сохранить каждый набор данных и связанную с ним модель в своем собственном объекте (и эти объекты, вероятно, окажутся в списке объектов). Есть ли способ сохранить или восстановить среду моих функций selfStart даже после того, как они сохранены в другом списке?
ОБНОВИТЬ
В ответ на предложение Грегора я попробовал следующее:
nls(as.formula(sprintf("weight ~ %s(Time, Asym, xmid, scal)",
"myobj$model")), data = myobj$data)
Ошибка в nls (as.formula (sprintf ("weight ~% s (Time, Asym, xmid, scal))",:
сингулярный градиент Дополнительно: Предупреждающее сообщение:
In nls (as.formula (sprintf ( "weight ~% s (Time, Asym, xmid, scal)",:
Для некоторых параметров не указаны начальные значения.
Инициализация 'Asym', 'xmid', 'scal' на '1.'. < br> Рассмотрите возможность указания start или использования модели selfStart
Обновление 2
Вдохновленный @Gregor, я нашел обходной путь:
nlsDispatch <- function(obj){
GLOBAL_NLS <<- obj$model
nls(weight ~ GLOBAL_NLS(Time, Asym, xmid, scal), data = myobj$data)
}
nlsDispatch(myobj)
Модель нелинейной регрессии
model: weight ~ GLOBAL_NLS (Time, Asym, xmid, scal)
data: myobj $ data
Asym xmid scal
937.02 35.22 11.41
остаточная сумма квадратов: 76,66Количество итераций до сходимости: 0
Достигнутый допуск сходимости: 6.621e-07
Это работает, но переносить мою функцию в глобальную среду некрасиво. И это говорит о том, что, если бы я лучше управлял средами, я смог бы избежать злоупотребления глобальной средой для достижения этой цели.
1: В моем приложении это в основном вопрос подсчета пиков и определения количества нормальных кривых, необходимых для их моделирования.
sprintf("weight ~ %s(Time, Asym, xmid, scal)", "SSlogis")
, а затем использовать на нейas.formula()
. - person Gregor Thomas   schedule 14.04.2016SSlogis
уже работает как есть. - person Tyler   schedule 14.04.2016sprintf("weight ~ %s(Time, Asym, xmid, scal)", myobj$model)
, еслиmyobj$model
имеет строковое имя функции, а не фактический объект функции. - person Gregor Thomas   schedule 14.04.2016