Import dataset
que
hay en el marco superior derecho.Este fichero
contiene los datos de la velocidad V
a la que tiene lugar
cierta reacción enzimática para distintas concentraciones
S
.
Guarda el contenido del fichero de datos en la variable
enzimas
. Determina los coeficientes de la curva que mejor
ajusta esta nube de puntos.
En primer lugar, hay que visualizar la nube de puntos. La segunda
pregunta sugiere considerar S
como variable explicativa y
V
como la variable respuesta
plot(enzimas$S, enzimas$V, cex = 0.5, pch = 19, col = "red")
La forma del gráfico sugiere o bien un modelo logarítmico, o bien una hiperbóla rectangular (puede que ya sepas que las reacciones enzimáticas de tipo Michaelis-Menten siguen una hipérbola). En cualquier caso, calcula las correlaciones de los datos “linealizados” (es decir, de las variables una vez que has hecho el cambio de variable que linealizaría la nube de puntos; puede que quieras consultas la tabla de la última diapositiva de la clase en la que vimos la regresión no lineal):
Para el cambio logarítmico
cor(log(enzimas$S), enzimas$V)^2
## [1] 0.7950565
Para el cambio a una hipérbola rectangular
cor(1/enzimas$S, 1/enzimas$V)^2
## [1] 0.8581265
La hipérbola explica en mayor proporción el comportamiento de los datos. Recuerda que la ecuación de una hipérbola rectangular es \[ V = \frac{b_0 S}{1 + b_1S} \]
El cambio de variable que transforma la expresión anterior en una recta es \(S = 1/S_{inv}\), \(V = 1/V_{inv}\). Si haces ese cambio, tienes
\[ \frac{1}{V_{inv}} = \frac{b_0 \frac{1}{S_{inv}}}{1 + b_1\frac{1}{S_{inv}}} \] multiplica el numerador de la fracción de la derecha por \(S_{inv}\) para obtener
\[ \frac{1}{V_{inv}} = \frac{b_0 }{S_{inv} + b_1} \] lo que equivale a
\[ S_{inv} + b_1 = b_0 V_{inv} \] es decir
\[ V_{inv} = \frac{S_{inv}}{b_0} + \frac{b_1}{b_0} \] que es la ecuación de una recta.
Haz el cambio de variable en los datos
V_inv = 1/enzimas$V
S_inv = 1/enzimas$S
visualiza la nube de puntos
plot(S_inv, V_inv)
y, como los puntos aparecen razonablemente alineados, calcula el modelo lineal y obten los coeficientes
modelo = lm(V_inv ~ S_inv)
modelo$coefficients
## (Intercept) S_inv
## 0.19891571 0.06735554
Esto proporciona da la fórmula
\[V_{inv} = 0.0673555 * S_{inv} + 0.1989157 \]
Para obtener los valores de \(b_0\) y \(b_1\), recuerda que \[ V_{inv} = \frac{S_{inv}}{b_0} + \frac{b_1}{b_0} \]
es decir, \[\frac{1}{b_0}=0.0673555 = \text{pendiente de la recta $S_{inv}$, $V_{inv}$}\] \[\frac{b_1}{b_0}=0.1989157 = \text{término independiente de la recta $S_{inv}$, $V_{inv}$}\]
Puedes despejar los coeficientes
\[b_0=\frac{1}{0.0673555}=14.8465879\]
y
\[b_1=0.1989157b_0 =2.9532196\]
de donde la fórmula de la hipérbola es
\[ V = \frac{14.8465879 * S}{1 + 2.9532196* S}\]
Si defines
termIndpte = unname(modelo$coefficients[1])
pendiente = unname(modelo$coefficients[2])
b0 = 1/pendiente
b1 = b0*termIndpte
puedes representar la nube de puntos original, y la curva que la aproxima
plot(enzimas$S, enzimas$V, cex = 0.5, pch = 19, col = "red",
xlim = c(0,5), ylim = c(0, 6))
par(new = TRUE)
x = seq(from = 0, to = 5, by = 0.001)
plot(x, b0*x/(1+b1*x), cex = 0.25, pch = 19, col = "blue",
xlim = c(0,5), ylim = c(0, 6))
En el contexto de la cinética enzimática hay dos cantidades (parámetros) importantes que caracterizan la reacción:
En el leguaje de las funciones:
Calcula Vmax y KM para los datos que tienes
Por un lado, la asíntota de la hipérbola se calcula como un límite:
\[\lim_{S\to\infty}\frac{14.8465879 * S}{1 + 2.9532196* S} = \frac{14.8465879}{2.9532196} =5.027255\]
Por otro lado, KM cumple la condición:
\[Vmax/2 = \frac{b_0*KM}{1+b_1*KM}\] Despejando KM se tiene
\[Vmax*(1+b_1*KM) = 2*b_0*KM\] que es equivalente a \[KM=\frac{Vmax}{2b_0-b_1Vmax}= 0.3386135\]
KM = Vmax/(2*b0-b1*Vmax)
Puedes comprobar que \[\frac{ b_0 * KM}{1 + b_1* KM} = \frac{14.8465879*0.3386135}{1+2.9532196 0.3386135} = 2.5136275\] coincide con \[\frac{ Vmax}{2} = \frac{5.027255}{2} = 2.5136275\]
Calcula la velocidad que predice el modelo para una concentración S = 3.
Hay dos alternativas:
O bien sustituyes en la ecuación de la hipérbola
b0*3/(1+b1*3)
## [1] 4.517374
O bien, puedes sustituir directamente en la recta de regresión obtenida \[ V_{inv} = \frac{S_{inv}}{b_0} + \frac{b_1}{b_0} \]
es decir,
\[\frac{1}{V} = 0.0673555 \frac{1}{3} + 0.1989157 = 0.2213676\]
y despejar
\[V = \frac{1}{0.2213676} = 4.5173738\]
Ejercicio basado en este material. Se ha calentado un preparado hasta aproximadamente 179.5F (Fahrenheit) y se ha dejado enfriar durante 50 minutos. Este fichero contiene los valores de la temperatura medida en distintos instantes.
Elige las variables explicativa y respuesta. A
la vista del último apartado, la variable explicativa es el tiempo
(minuto
) y la variable respuesta es la
temperatura
.
Representa el diagrama de dispersión. Suponer
que el fichero de datos se llama df1
plot(df1$minuto, df1$temperatura)
Establece el/los modelo(s) candidato(s) a ajustar esos datos. El diagrama anterior sugiere los modelos exponencial o potencial. También podría tratarse de un logaritmo.
Selecciona el mejor modelo y calcula los coeficientes del mismo. La selección del modelo se hace con el coeficiente de determinación calculado sobre los datos linealizados (transformados de forma que puedan ser ajustados por una recta). En el caso de la exponencial se cambia temperatura por su logaritmo
cor(df1$minuto, log(df1$temperatura))^2
[1] 0.967841
En el caso de la potencia se cambian ambas variables por su logaritmo
cor(log(df1$minuto), log(df1$temperatura))^2
[1] 0.9803893
Para el logaritmo se cambian la variable independiente por su logaritmo
cor(log(df1$minuto), df1$temperatura)^2
[1] 0.9935502
No está de más ver qué sucede con el modelo lineal
cor(df1$minuto, df1$temperatura)^2
[1] 0.9394671
y con el hiperbólico
cor(1/df1$minuto, 1/df1$temperatura)^2
[1] 0.7501289
Concluimos que el modelo logaritmo $temperatura = b_0 +b_1minuto $ es el mejor de los cinco
Calculamos los coeficientes del modelo linealizado
(lm1 = lm(df1$temperatura ~ log(df1$minuto)))
Call:
lm(formula = df1$temperatura ~ log(df1$minuto))
Coefficients:
(Intercept) log(df1$minuto)
222.16 -30.98
Recuerda que en este caso tanto el término independiente como la pendiente obtenidas a partir de los datos transformados son directamente los coeficientes del modelo
(b0 = unname(lm1$coefficients[1]))
[1] 222.1606
(b1 = unname(lm1$coefficients[2]))
[1] -30.98433
de modo que el modelo que hemos obtenido es \[temperatura = 222.1606069 -30.9843278 * \ln(minuto)\] A tener en cuenta:
log()
Calcula la temperatura a la que según modelo estaba el preparado a los 20 minutos. Hay que sustituir en la fórmula anterior
b0 + b1 * log(20)
[1] 129.3399
No es necesario usar tantos decimales y se puede redondear a 129.3F.
Ejercicio basado en este material. Este fichero contiene datos de la concentración de alcohol en sangre (BAC, blood alcohol concentration) y el riesgo relativo de tener un accidente al volante (RRC, relative risk of crashing).
Elige las variables explicativa y respuesta. A
la vista del útlimo apartado, la variable explicativa es la
concentración de alcohol en sangre (BAC
) y la variable
respuesta es el riesgo relativo de chocar RRC
.
Representa el diagrama de dispersión. Suponer
que el fichero de datos se llama df1
plot(df2$BAC, df2$RRC)
Establece el/los modelo(s) candidato(s) a ajustar esos datos. El diagrama anterior sugiere los modelos exponencial o potencial. De todos modos, no está de más comprobarlos todos (también el lineal, logarítmico e hiperbólico).
Selecciona el mejor modelo y calcula los coeficientes del mismo. La selección del modelo se hace con el coeficiente de determinación calculado sobre los datos linealizados (transformados de forma que puedan ser ajustados por una recta). En el caso de la exponencial se cambia temperatura por su logaritmo
cor(df2$BAC, log(df2$RRC))^2
[1] 0.9712205
En el caso de la potencia se cambian ambas variables por su logaritmo
cor(log(df2$BAC), log(df2$RRC))^2
[1] NaN
Se produce un error al calcular la correlación. Si observamos los
datos de log(df2$BAC)
, que es lo que hay de diferente con
el último cálculo que funcionó vemos que
log(df2$BAC)
[1] -Inf -4.605170 -3.506558 -2.995732 -2.659260 -2.407946 -2.207275
[8] -2.040221 -1.897120 -1.771957 -1.660731 -1.560648
Aparece un valor -Inf
que tiene que ver con intentar
calcular el logaritmo de 0
df2$BAC
[1] 0.00 0.01 0.03 0.05 0.07 0.09 0.11 0.13 0.15 0.17 0.19 0.21
Así es que debemos tomar una decisión: o bien usar directamente la exponencial (porque no es posible probar con los modelos que involucran el logaritmo de BAC), o bien prescindir de la primera observación (para poder calcular los logaritmos). Vamos a optar por esta última opción, ya que introduce algo nuevo (eliminar filas de una tabla). Como nos queremos quedar con todas las filas excepto la primera, y con todas las columnas, podemos escribir
df2bis = df2[2:nrow(df2), ]
Compara
head(df2)
BAC RRC
1 0.00 1.00
2 0.01 1.03
3 0.03 1.06
4 0.05 1.38
5 0.07 2.09
6 0.09 3.54
head(df2bis)
BAC RRC
2 0.01 1.03
3 0.03 1.06
4 0.05 1.38
5 0.07 2.09
6 0.09 3.54
7 0.11 6.41
Calculamos ahora los coeficientes de determinación:
Recta
cor(df2bis$BAC, df2bis$RRC)^2
[1] 0.7163863
Exponencial
cor(df2bis$BAC, log(df2bis$RRC))^2
[1] 0.9813868
Potencia
cor(log(df2bis$BAC), log(df2bis$RRC))^2
[1] 0.7454332
Logaritmo
cor(log(df2bis$BAC), df2bis$RRC)^2
[1] 0.4004605
Hiperbola
cor(1/df2bis$BAC, 1/df2bis$RRC)^2
[1] 0.5966757
Cláramente el modelo exponencial \(RRC = b_0 e^{b_1*BAC}\) es el mejor de los dos. Volvemos a usar el conjunto de datos original, con la primera fila, porque el 0 no da problema en el cambio a la exponencial
Calculamos los coeficientse del modelo linealizado.
(lm2 = lm(log(df2$RRC) ~ df2$BAC))
Call:
lm(formula = log(df2$RRC) ~ df2$BAC)
Coefficients:
(Intercept) df2$BAC
-0.5395 23.8176
Recuerda que el término independiente obtenido es el logaritmo de \(b_0\), es decir, el valor de \(b_0\) es
(b0 = exp(unname(lm2$coefficients[1])))
[1] 0.5830483
(b1 = (unname(lm2$coefficients[2])))
[1] 23.81758
de modo que el modelo que hemos obtenido es \[RCC = 0.5830483* e^{23.8175766*BAC}\]
Si hubieras optado por continuar sin usar la primera fila de la tabla el resultado sería el siguiente
Calculamos los coeficientse del modelo linealizado.
(lm2bis = lm(log(df2bis$RRC) ~ df2bis$BAC))
Call:
lm(formula = log(df2bis$RRC) ~ df2bis$BAC)
Coefficients:
(Intercept) df2bis$BAC
-0.7369 25.1663
Recuerda que el término independiente obtenido es el logaritmo de \(b_0\), es decir, el valor de \(b_0\) es
(b0bis = exp(unname(lm2bis$coefficients[1])))
[1] 0.4786011
(b1bis = (unname(lm2bis$coefficients[2])))
[1] 25.16629
de modo que el modelo que hemos obtenido es \[RCC = 0.4786011* e^{25.1662898*BAC}\]
Calcula el RRC que, según modelo, está asociado con un BAC de 0.16. Basta sustituir en la fórmula anterior
b0 * exp(b1*0.16)
[1] 26.34628
Obviamente, no es preciso (ni conveniente) usar tantos decimales para dar el resultado final, que se puede redondear a 81.00 con dos cifras significativas. Es decir, según el modelo es 27 veces más probable tener un accidente con 0.16 de concentración de alcohol en sangre que con 0.
Lee este fichero de datos. Se pide:
Representa el diagrama de dispersión. Si
llamamos a la tabla de datos datos1
, obtenemos el diagrama
de dispersión con:
plot(datos1$x, datos1$y)
Establece el/los modelo(s) candidato(s) a ajustar esos datos. los candidatos son, o bien una función exponencial \[ y = b_0e^{b_1x} \]
o bien una función potencial \[y = b_0 x^{b_1}\]
Selecciona el mejor modelo y calcula los coeficientes del mismo. Usaremos el modelo que tenga un coeficiente de determinación mayor, es decir, aquel que explique en mayor medida (proporción) la variabilidad conjunta de las variables involucradas. Para hacer el cálculo hay que “linealizar” los datos, es decir, aplicar una transformación (o cambio de variable). Par la exponencial hay que trabajar con \(x,\,w=\log(y)\), mientras que para una potencial es \(z = \log(x),\,w=\log(y)\).
Fíjate en los diagramas de dispersión
par(mfrow = c(1,3))
plot(datos1$x, datos1$y)
plot(datos1$x, log(datos1$y), main = "Exponencial")
plot(log(datos1$x), log(datos1$y), main = "Potencia")
par(mfrow = c(1,1))
Salvo por unos pocos valores, la figura del centro parece ser la que mejor transforma los datos.
Los coeficientes de determinación (que son los de correlación al cuadrado) son
# exponencial
cor(datos1$x, log(datos1$y))^2
[1] 0.8051923
# potencia
cor(log(datos1$x), log(datos1$y))^2
[1] 0.7198342
Puedes comprobar el resto de modelos que conoces
# lineal
cor(datos1$x, datos1$y)^2
[1] 0.7831438
# logaritmico
cor(log(datos1$x), datos1$y)^2
[1] 0.549002
# hiperbólico
cor(1/datos1$x, 1/datos1$y)^2
[1] 0.1464847
Efectivamente, el de la exponencial es el mejor de todos: no tiene un valor muy próximo a uno, pero corrobora la inspección visual.
Calculamos los coeficientes de la recta de regresión de las variables linealizadas
# guardar el modelo lineal en una variable
lmExp = lm(log(datos1$y) ~ datos1$x)
# acceder a los coeficientes del modelo
lmExp$coefficients
(Intercept) datos1$x
0.4120421 0.5444136
Recuerda que el valor de \(b_0\) que hemos obtenido es el logaritmo de \(b_0\), de modo que
(b0 = exp(lmExp$coefficients[1]))
(Intercept)
1.509898
b1 = lmExp$coefficients[2]
y la expresión de la función que buscábamos es, redondeando a 3 cifras significativas, \(y = 1.509898 * e^{0.5444136*x}\)
Si quieres representar la nube de puntos junto con la función que la ajusta:
plot(datos1$x, datos1$y)
par(new = TRUE)
lines(datos1$x, b0*exp(b1*datos1$x), col = "violet", lwd = 3)
Ejercicio basado en este material. Este fichero contiene datos de la evolución de la esperanza de vida a lo largo de varias décadas.
Elige las variables explicativa y respuesta. Parece razonable expresar la esperanza de vida en función del año y no al revés. De todos modos, como correlación no implica causalidad, se puede buscar la relación contraria (aunque no podremos responder la última pregunta).
Representa el diagrama de dispersión.
Si llamamos df4
a la tabla de datos, basta con hacer
plot(df4$decada, df4$esperanza_vida,
pch = 19, col = "green",
xlab = "Década", ylab = "Esperanza vida")
Establece el/los modelo(s) candidato(s) a ajustar esos datos. El diagrama anterior sugiere los modelos logarítmico \[ y = b_0+b_1\log(x) \Rightarrow \text{ cambio } \Rightarrow w = \log(x)\] o hiperbólico \[y = \dfrac{b_0}{1+b_1x} \Rightarrow \text{ cambio } \Rightarrow w = 1/x,\,z = 1/x \]
Selecciona el mejor modelo y calcula los coeficientes del mismo. Como en otras ocasiones, se calculan los correspondientes coeficientes de determinación (calculado sobre los datos linealizados, transformados de forma que puedan ser ajustados por una recta) para hacer la selección del modelo. En el caso logarítmico
cor(log(df4$decada), df4$esperanza_vida)^2
[1] 0.9624487
Para la hipérbola
cor(1/df4$decada, 1/df4$esperanza_vida)^2
[1] 0.9194304
No cuesta nada calcuar \(r^2\) para el resto de modelos que conocemos
# lineal
cor(df4$decada, df4$esperanza_vida)^2
[1] 0.9600881
# exponencial
cor(df4$decada, log(df4$esperanza_vida))^2
[1] 0.938958
# potencia
cor(log(df4$decada), log(df4$esperanza_vida))^2
[1] 0.9420928
El logarítmico arroja un coeficiente algo mayor. Ten en cuenta que se trata del “fragmento” de curva que mejor aproxima los datos, aunque pueda no tener sentido biológico a largo plazo. Es decir, la esperanza de vida, ¿está acotada superiormente (hipérbola) o no (logaritmo)? La regresión no responde esas perguntas :) Calculamos los coeficientes del modelo linealizado
lm4 = lm(df4$esperanza_vida ~ log(df4$decada))
(b0 = unname(lm4$coefficients[1]))
[1] -4856.402
(b1 = unname(lm4$coefficients[2]))
[1] 649.2619
En este caso (el logarítmico) se obtienen directamente los valores de \(b_0\) y \(b_1\), de modo que el modelo que hemos obtenido es \[RCC = -4856.4020573+ 649.2618715 * log(decada) \]
Calcula la esperanza de vida predicha por el modelo para el año 1974. Basta sustituir en la fórmula anterior
b0+ b1*log(1974)
[1] 70.07835
No tiene sentido usar todos esos decimales, es suficiente con decir, or ejemplo, casi 70 años y medio.
Lee este fichero de datos. Se pide:
Representa el diagrama de dispersión. En primer lugar, hay que leer los datos
datos2 = read.table(file = "Practica03-nolineal2.csv", sep = " ", header = T, dec = ".")
para poder hacer el diagrama de dispersión:
x = datos2$x
y = datos2$y
plot(x, y)
Establece el/los modelo(s) candidato(s) a ajustar esos datos. los candidatos son, o bien una función logarítmica \[ y = b_0+b_1\log(x) \] o bien una hipérbola \[y = \dfrac{b_0x}{1+b_1x} \]
Selecciona el mejor modelo y calcula los coeficientes del mismo. Usaremos el modelo que tenga un coeficiente de determinación mayor, es decir, aquel que explique en mayor medida (proporción) la variabilidad conjunta de las variables involucradas. Para hacer el cálculo hay que “linealizar” los datos, es decir, aplicar una transformación (o cambio de variable). Par la logarítmica hay que trabajar con \(w=\log(x),\,y\), mientras que para una hipérbola es \(z = 1/x,\,w=1/y\). Fíjate en los diagramas de dispersión
par(mfrow = c(1,3))
plot(x, y)
plot(log(x), y, main = "Logaritmo")
plot(1/x, 1/y, main = "Hipérbola")
par(mfrow = c(1,1))
Ahora los gráficos no parecen nada claros debido a los valores extremos a la derecha del gráfico de la derecha. Los coeficientes de determinación (que son los de correlación al cuadrado) son
# logaritmica
cor(y, log(x))^2
[1] 0.9589466
# hiperbolica
cor(1/x, 1/y)^2
[1] 0.9441914
De nuevo, calculamos el \(r^2\) del resto de modelos
# lineal
cor(y, x)^2
[1] 0.8270014
# exponencial
cor(y, log(x))^2
[1] 0.9589466
# potencia
cor(log(x), log(y))^2
[1] 0.9380373
Efectivamente, los coeficientes de correlación aclaran la duda en favor del modelo logarítmico. Calculamos los coeficientes de la recta de regresión de las variables linealizadas
z = y
w = log(x, base = exp(1))
lmLOG = lm(z ~ w)
lmLOG$coefficients
(Intercept) w
3.869179 1.319270
Recuerda que en este caso \(b_0\) y \(b_1\) no han sufrido transformación alguna, por lo que podemos ecuperarlos directamente
(b0 = unname(lmLOG$coefficients[1]))
[1] 3.869179
(b1 = unname(lmLOG$coefficients[2]))
[1] 1.31927
y la expresión de la función que buscábamos es, redondeando a 3 cifras significativas, \[ y = 3.87+1.32 \ln(x) \] donde \(\ln\) representa el logaritmo neperiano. Si quieres representar la nube de puntos junto con la función que la ajusta:
plot(x, y)
par(new = TRUE)
lines(x, b0 + b1*log(x, base = exp(1)), col = "violet", lwd = 3)