2017-02-03 2 views
1

Je voudrais ajuster plusieurs courbes à la fois, et les comparer statistiquement, en termes de leurs 3 paramètres estimés - asymptote, pente et x0. Voici une image idéalisée des données à modéliser: enter image description hereAjuster et comparer plusieurs courbes sigmoïdes dans R

pages plus interrogeables se présentent des méthodes pour adapter à une seule courbe, comme on le voit ici: http://kyrcha.info/2012/07/08/tutorials-fitting-a-sigmoid-function-in-r/ et ici http://rstudio-pubs-static.s3.amazonaws.com/7812_5327615eb0044cf29420b955ddaa6173.html

Dans mon case, Je voudrais tester (statistiquement) l'effet de la modification des niveaux variables sur les trois paramètres du sigmoïde. Autrement dit, quand je suis montage ce modèle:

model <- nls(y ~ asym/(1 + exp(-slope * (x – x0))), start = c(…), data = my_data) 

Je voudrais ajouter des interactions de deux facteurs (par exemple, « Factora » et « factorB ») avec chacun des asym, la pente et x0 termes, la façon dont nous pouvons faire avec lm() ou glm(), comme dans les domaines suivants:

model_int <- nls(y ~ asym*factorA/(1 + exp(-(slope*factorA) * (x – (x0*factorA))), start = c(…), data = my_data) 

de cette façon, je peux voir si ces trois paramètres sont statistiquement différents entre les différents niveaux de Factora (et éventuellement plusieurs autres facteurs, comme vous pouvez le voir sur l'image). Par exemple, nous pouvons voir que "Condition" a un effet sur l'asymptote des courbes.

Je l'ai fait précédemment avec codage fictif chaque niveau de chaque variable d'interaction, mais ce n'est pas un moyen de tester directement ces variables, et est plutôt verbeux que les modèles vont. Il ressemble à ceci:

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) 

Comme vous pouvez le deviner, cette méthode présente des inconvénients évidents en termes de tidyness et le manque de interprétabilité.

Est-ce que quelqu'un sait comment adapter un ensemble de sigmoids où les paramètres interagissent avec des variables dans l'ensemble de données pour produire des courbes de formes légèrement différentes?

Répondre

0

Eh bien, je ne sais pas si c'est ce que vous cherchez, mais cet exemple de mai fonction nls vous aide:

> 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) 

Donc, dans votre cas, il sera quelque chose comme ceci:

fit <- nls(y ~ asym[Factor]/ (1 + exp(-slope[Factor]*(x –x0[Factor]))), start = c(…), data = my_data)

Hope this helps