Describe como ajustar varios modelos no-lineales de regresión para curvas de dosis-respuesta. Para ello describe el paquete drc. Entre las varias funciones que incluye permite la comparación de parámetros (por ejemplo ED10 o ED90).
Manual de drc. Cuidado que apartir de 2016 hay cambios sustanciales, y algunas de las funciones del paper ya no están disponibles.
Instalamos el paquete drc y sus dependencias install.packages("drc")
Según los autores los dos modelos más ampliamente utilizados son EL MODELO LOGÍSTICO (LOGISTIC MODEL) y EL MODELO GOMPERTZ.
Para el modelo logístico hay cuatro parámetros: e
(ED50), d
(upper limit), c
(lower limit), b
(relative slope around e) (Función 1)
Función 1
Existe el mismo modelo con solo tres parámetros, siendo el límite inferior del anterior igual a cero.
En caso de que exista hormesis se debe emplear el modelo de Brain-Cousens (Brain and Cousens 1989).
Una vez seleccionado el modelo y realizado (varias especies, varios compuestos, etc.), es interesante comparar parámetros entre las diferentes curvas. Para ello utilizan un modelo simple que se ajusta y se utiliza el modelo delta (van der Vaart 1998, en el capítulo 3). Con ello se consiguen calcular los errores estandard para las funciones de los parámetros.
Para el caso de los herbicidas se utiliza la EFFECTIVE DOSAGE (ED) y el SELECTIVITY INDEX (SI). Por ejemplo la ED50 sería la mitad de la máxima respuesta alcanzada (que sería el 100%). El SI es la ratio entre ED de dos curvas distintas.
La principal función es multdrc
.
El la Tabla 1 del paper se especifican las diferentes funciones para los diferentes modelos.
Una vez realizado el modelo se pueden realizar varias cosas, por ejemplo un ANOVA entre dos modelos (anova
), dibujar los modelos (plot
), o plotdrc
con las observaciones, todas las curvas juntas, etc.
Empezamos cargando el paquete:
library(drc)
## Warning: package 'drc' was built under R version 3.4.3
## Loading required package: MASS
## Warning: package 'MASS' was built under R version 3.4.3
##
## 'drc' has been loaded.
## Please cite R and 'drc' if used for a publication,
## for references type 'citation()' and 'citation('drc')'.
##
## Attaching package: 'drc'
## The following objects are masked from 'package:stats':
##
## gaussian, getInitial
FINNEY71
Se emplean datos que estan en el paquete para el ejemplo finney71
. For each of six concentration of an insecticid the number of insects affected (out of the number of insects) was recorded. A data frame with 6 observations on the following 3 variables:
dose
: a numeric vector
total
: a numeric vector
affected
: a numeric vector
data(finney71)
finney71
## dose total affected
## 1 10.2 50 44
## 2 7.7 49 42
## 3 5.1 46 24
## 4 3.8 48 16
## 5 2.6 50 6
## 6 0.0 49 0
dose<-(finney71$dose)
affected<-(finney71$affected)
plot(dose, affected)
Ahora hacemos el modelo a través de la función drm
. El argumento fct
indica el tipo de modelo, en este caso de cuatro parámetros logístico. Para ello hacemos lo siguiente sin poner ninguna restricción de valor máximo ni mínimo:
modelo1<-drm(affected ~ dose, data=finney71, fct=LL.4())
plot(modelo1)
summary(modelo1)
##
## Model fitted: Log-logistic (ED50 as parameter) (4 parms)
##
## Parameter estimates:
##
## Estimate Std. Error t-value p-value
## b:(Intercept) -3.123049 0.761812 -4.0995 0.054669 .
## c:(Intercept) -0.044097 2.310337 -0.0191 0.986505
## d:(Intercept) 49.988650 5.241182 9.5377 0.010815 *
## e:(Intercept) 4.975754 0.475453 10.4653 0.009007 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error:
##
## 2.344228 (2 degrees of freedom)
Ahora lo repetimos limitando el valor máximo a 50 y el mínimo a cero, y dando el nombre a cada una de las variables del modelo. Si se pone NA
no se hace ninguna limitación:
modelo2<-drm(affected ~ dose, data=finney71, fct=L.4(fixed = c(NA, 0, 50, NA), names = c("slope", "lower limit", "upper limit", "EC50")))
plot(modelo2)
summary(modelo2)
##
## Model fitted: Logistic (ED50 as parameter) (2 parms)
##
## Parameter estimates:
##
## Estimate Std. Error t-value p-value
## slope:(Intercept) -0.630776 0.085379 -7.388 0.00179 **
## EC50:(Intercept) 5.242461 0.223590 23.447 1.961e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error:
##
## 2.520149 (4 degrees of freedom)
Ahora se puede realizar un anova
para comparar dos modelos entre si, en este caso al ser los mismos datos los modelos son iguales (no significativos):
anova(modelo1, modelo2, details=TRUE,test=NULL)
##
## 1st model
## fct: L.4(fixed = c(NA, 0, 50, NA), names = c("slope", "lower limit",
## 2nd model
## fct: LL.4()
## ANOVA table
##
## ModelDf RSS Df F value p value
## 2nd model 4 25.405
## 1st model 2 10.991 2 1.3114 0.4326
Se puede aplicar el test de Neill para ver la falta de ajuste del modelo (tanto con concentraciones replicadas como no replicadas), se utiliza el argumento neill.test
:
neill.test(modelo1)
## Grouping used
##
## 1 2 3 4 5
## 1 1 1 2 1
## Neill's lack-of-fit test
##
## F value p value
## 37.3867 0.1032
neill.test(modelo2)
## Grouping used
##
## 1 2 3
## 2 3 1
## Neill's lack-of-fit test
##
## F value p value
## 1.3998 0.3220
Para conocer los intervalos de confianza se utiliza confint
:
confint(modelo1)
## 2.5 % 97.5 %
## b:(Intercept) -6.400861 0.1547641
## c:(Intercept) -9.984676 9.8964821
## d:(Intercept) 27.437664 72.5396360
## e:(Intercept) 2.930043 7.0214648
confint(modelo2)
## 2.5 % 97.5 %
## slope:(Intercept) -0.8678246 -0.393727
## EC50:(Intercept) 4.6216749 5.863248
DAPHNIDS
Cargamos lo datos del ejemplo, en este caso tenemos dos tiempos (24 y 48h), dosis, respuesta (inmóviles) y total de individuos. Se cuentan los mismos individuos en los dos periodos:
data(daphnids)
daphnids
## dose no total time
## 1 105.00 0 20 24h
## 2 400.07 1 20 24h
## 3 600.10 3 20 24h
## 4 1199.20 3 20 24h
## 5 1999.33 5 20 24h
## 6 3198.52 6 20 24h
## 7 5596.91 7 20 24h
## 8 9595.57 17 20 24h
## 9 105.00 0 20 48h
## 10 400.07 0 20 48h
## 11 600.10 6 20 48h
## 12 1199.20 8 20 48h
## 13 1999.33 11 20 48h
## 14 3198.52 16 20 48h
## 15 5596.91 18 20 48h
## 16 9595.57 20 20 48h
plot(daphnids$no~daphnids$dose, daphnids$time)
Realizamos el modelo dividiendo los afectados respecto al total frente a la concentración no/total~dose
y en función del time
. En este caso se opta por un modelo logístico de dos parámetros LL.2(), type = "binomial"
, con valor máximo de 1 y mínimo de o:
modelo3 <- drm(no/total~dose, time, weights = total,
data = daphnids, fct = LL.2(), type = "binomial")
modelFit(modelo3)
## Goodness-of-fit test
##
## Df Chisq value p value
##
## DRC model 12 13.873 0.3089
plot(modelo3, xlab="Log Dose",ylab="Response (0-1)")
summary(modelo3)
##
## Model fitted: Log-logistic (ED50 as parameter) with lower limit at 0 and upper limit at 1 (2 parms)
##
## Parameter estimates:
##
## Estimate Std. Error t-value p-value
## b:24h -1.17384 0.22236 -5.2791 1.298e-07 ***
## b:48h -1.84968 0.27922 -6.6244 3.488e-11 ***
## e:24h 5134.03344 1056.74197 4.8584 1.184e-06 ***
## e:48h 1509.06539 187.76008 8.0372 9.037e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Para conocer los intervalos de confianza se utiliza confint
:
confint(modelo3)
## 2.5 % 97.5 %
## b:24h -1.609647 -0.7380275
## b:48h -2.396943 -1.3024081
## e:24h 3062.857245 7205.2096381
## e:48h 1141.062395 1877.0683753
Brain P, Cousens R (1989). “An Equation to Describe Dose Responses where there is Stimulation of Growth at Low Dose” Weed Research, 29, 93-96.
van der Vaart AW (1998). Asymptotic Statistics. Cambridge University Press, Cambridge.