Подберите и сравните несколько сигмовидных кривых в R
Я хотел бы подогнать несколько кривых одновременно и сравнить их статистически, с точки зрения их трех оценочных параметров - асимптот, наклона и x0. Вот идеализированное изображение данных для моделирования:
Большинство доступных для поиска страниц используют методы, чтобы соответствовать одной кривой, как показано здесь: http://kyrcha.info/2012/07/08/tutorials-fitting-a-sigmoid-function-in-r/ и здесь http://rstudio-pubs-static.s3.amazonaws.com/7812_5327615eb0044cf29420b955ddaa6173.html
В моем случае я хотел бы проверить (статистически) влияние изменения переменных уровней на три параметра сигмоида. То есть, когда я подгоняю эту модель:
model <- nls(y ~ asym / (1 + exp( -slope * (x – x0) ) ), start = c(…), data = my_data)
Я хотел бы добавить взаимодействия двух факторов (скажем, "factorA" и "factorB") с каждым из членов asym, slope и x0, как мы можем это сделать lm()
или же glm()
, как в следующем:
model_int <- nls(y ~ asym*factorA / (1 + exp( -(slope*factorA) * (x – (x0*factorA) ) ), start = c(…), data = my_data)
Таким образом, я могу видеть, являются ли эти три параметра статистически различными на разных уровнях фактора А (и, возможно, на множестве других факторов, как вы можете видеть на рисунке). Например, мы можем видеть, что "Условие" влияет на асимптоту кривых.
Ранее я делал это с помощью фиктивного кодирования каждого уровня каждой взаимодействующей переменной, но это не способ непосредственно протестировать эти переменные, а довольно многословно с точки зрения моделей. Это выглядит так:
model_dummy <- nls(y ~ (asym+ asym.L1 * is.L1 + asym.l2*is.L2) /
(1 + exp( -slope * (x – (x0 + x0.L1 * is.L1 + x0.L2 * is.L2) ) ) ),
start = c(…), data = my_data)
Как вы можете догадаться, этот метод имеет очевидные недостатки с точки зрения аккуратности и отсутствия интерпретируемости.
Кто-нибудь знает, как установить набор сигмоидов, где параметры взаимодействуют с переменными в наборе данных, чтобы получить кривые немного другой формы?
1 ответ
Ну, я не уверен, что это то, что вы ищете, но этот пример из nls
Функция май поможет вам:
> head(muscle)
Strip Conc Length
3 S01 1 15.8
4 S01 2 20.8
5 S01 3 22.6
6 S01 4 23.8
9 S02 1 20.6
10 S02 2 26.8
# get some initial values
musc.1 <- nls(Length ~ cbind(1, exp(-Conc/th)), muscle,
start = list(th = 1), algorithm = "plinear")
summary(musc.1)
# and now with factor Strip
b <- coef(musc.1)
musc.2 <- nls(Length ~ a[Strip] + b[Strip]*exp(-Conc/th), muscle,
start = list(a = rep(b[2], 21), b = rep(b[3], 21), th = b[1]))
summary(musc.2)
Так что в вашем случае это будет примерно так:
fit <- nls(y ~ asym[Factor]/ (1 + exp(-slope[Factor]*(x –x0[Factor]))),
start = c(…),
data = my_data)
Надеюсь это поможет