Подберите и сравните несколько сигмовидных кривых в 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)

Надеюсь это поможет

Другие вопросы по тегам