как использовать nls для оценки параметров?

Я хочу оценить e50 e0 emax по модели emax, уравнение Y=E0 + ((DOSE * EMAX)/(DOSE + ED50)) Я хочу использовать алгоритм по умолчанию Как я могу оценить E0 EMAX и E50?

Я нашел пример кода:

args(nls)
function (formula, data = parent.frame(), start, control = nls.control(),
algorithm = c("default", "plinear", "port"), trace = FALSE,
subset, weights, na.action, model = FALSE, lower = -Inf,
upper = Inf, ...)
NULL

Спасибо


person user35631    schedule 18.08.2014    source источник
comment
Итак... где ваши данные?   -  person IRTFM    schedule 18.08.2014
comment
Это не пример кода, это просто сигнатура функции. На странице справки ?nls должны быть примеры.   -  person MrFlick    schedule 18.08.2014
comment
Взгляните на простые примеры в этом моем старом ответе: stackoverflow.com/a/15102307/496803 Они должны показывать вы, как использовать nls с некоторыми предварительно обработанными примерами.   -  person thelatemail    schedule 18.08.2014
comment
я только что добавил данные   -  person user35631    schedule 18.08.2014


Ответы (1)


Данные вашего примера не кажутся хорошо названными, поэтому я притворюсь, что не видел их. Создайте вектор с именем dose, который содержит информацию о вашей дозе, и вектор с именем Y, который содержит переменную Y. Очевидно, они должны быть одинаковой длины. Я просто использую rnorm() для своего примера. Затем просто вызовите nls с некоторыми разумными начальными значениями. Я просто выберу кое-что на ровном месте.

> dose <- rnorm(400)
> Y <- rnorm(400)
> nls(formula=Y~e0+((dose*emax)/(dose+ed50)),start=c(e0=1,emax=10,ed50=2))
Nonlinear regression model
  model: Y ~ e0 + ((dose * emax)/(dose + ed50))
   data: parent.frame()
      e0     emax     ed50 
0.036105 0.005475 1.991276 
 residual sum-of-squares: 373.8

Number of iterations to convergence: 21 
Achieved convergence tolerance: 9.759e-06
person farnsy    schedule 18.08.2014
comment
спасибо за ответ, но могу ли я узнать, почему e0=1,emax=10,ed50=2? как вы выбрали эти значения - person user35631; 18.08.2014
comment
Это были первые случайные числа, которые пришли мне в голову. Вы можете использовать все нули, если хотите. Начальные значения не имеют значения, если проблема хорошо себя ведет. Тем не менее, используйте что-то близкое к тому, где вы думаете, что это закончится, если вы можете ... или используйте ноль или что-то еще. Вам просто нужно дать ему что-то. - person farnsy; 18.08.2014
comment
почему, когда я пытаюсь это сделать, функция не работает? nls (формула = Y ~ e0 + ((доза ^ h * emax) / (доза ^ h + ed50)), start = c (e0 = 1, emax = 10, ed50 = 2, h = 2)) спасибо - person user35631; 18.08.2014
comment
Не знаю. Попробуйте опубликовать выходные данные, которые R дает вам, когда вы пытаетесь, а также часть, по крайней мере, векторов Y и дозы. Вы можете получить готовый вывод с помощью команды dput(). - person farnsy; 18.08.2014
comment
Ответов несколько: один - это ошибка в nls (формула = Y ~ e0 + ((доза ^ h * emax)/(доза ^ h + ed50)), start = c (e0 = 100, : количество итераций превышено максимальное из 50 еще одна ошибка в nlsModel(formula, mf, start, wts): сингулярная матрица градиента при оценке начальных параметров +ed50)),start=c(e0=100,emax=100,ed50=20,h=10)) Y слишком длинный, но моя доза - это доза ‹- c(rep(5,30),rep(25) ,30),реп(100,30),реп(250,30)) - person user35631; 18.08.2014
comment
Возможно, вам придется попробовать множество других отправных точек, пока вы не найдете ту, которая работает, или, может быть, просто позволить больше итераций. Ваша целевая функция кажется мне немного неприятной, поэтому оптимизация нетривиальна. - person farnsy; 18.08.2014