7 votos

Regresión exponencial linealizada mediante lm() frente a la regresión no lineal nls()

Descargo de responsabilidad

Soy nuevo en este sitio, relativamente nuevo en R (dos semanas de aprendizaje), tengo sólo un conocimiento muy básico en la estadística así que lo siento si estoy haciendo un error tonto allí o hacer mala pregunta o algo.

Tampoco sé cómo incrustar bien mi conjunto de datos en el post (he buscado en meta sin encontrar nada al respecto), así que he compartido un enlace desde Google Drive (si conoces una forma mejor, por favor, házmelo saber y puedo cambiarlo o hacerlo tú mismo si tienes derecho a editar).

Explicación

En la asignatura de Laboratorio físico que estoy cursando he realizado un experimento para determinar el coeficiente de atenuación de un medio óptico utilizando filtros ópticos de diferentes grosores (con este espectrómetro http://www.vernier.com/products/sensors/spectrometers/visible-range/v-spec/ ).

Generó datos que puedes descargar aquí para reproducir mis resultados: https://docs.google.com/uc?authuser=0&id=0B5x0REqWCRBuaHlXc2JWZ19sWE0&export=download

Mi objetivo es determinar $\kappa(\lambda)$ , donde $\kappa$ es el coeficiente de atenuación y $\lambda$ de onda, utilizando la ley de Beer-Lambert que dice ( $l$ es el grosor): $$\theta=x_0 \cdot \exp(-\kappa \cdot l)$$

Tengo 5 "curvas" para diferentes espesores de filtros ópticos (de 1 a 5 mm) y ajusto el modelo exponencial para cada longitud de onda $\lambda$ que me da la $\kappa$ para esa longitud de onda.

He probado esto:

Modelo linealizado

Tomando el logaritmo de la ecuación anterior y alguna manipulación algebraica obtenemos $$ \ln \left( \frac{x_0}{\theta} \right) = \kappa \cdot l$$

representado por el comando R lm( I(log(x0/temp.theta)) ~ l + 0 )

Modelo no lineal

Tomo la ley de Beer-Lambert (primera ecuación) y la modifico por nls(temp.theta ~ I(x0 * exp(-k*l)) + 0 , start= list(k = k.l)) donde se obtiene del modelo linealizado k.l = coef(lm(...)) .

Código de reproducción

He puesto x0 = 100 desde $\theta$ se mide en porcentajes.

x0 = 100 #x=0 intercept of the exp function

data = read.delim2("export2.csv")

l = data$l
    l = l[-which(is.na(l))]
    data$l = NULL

data$kappa.l = NA
    data$sd.l = NA
data$kappa.nl = NA
    data$sd.nl = NA

for(i in 1:nrow(data)){

  temp.theta = as.numeric(data[i,-which(names(data) %in% c("lambda","kappa.l","kappa.nl","sd.l","sd.nl"))])
  temp.lm = lm( I(log(x0/temp.theta)) ~ l + 0 )
  k.l = coef(temp.lm)
  data[i , "kappa.l"] = k.l
  data[i , "sd.l"] = coef(summary(temp.lm))[ ,"Std. Error"]

  temp.nls = nls(temp.theta ~ I(x0 * exp(-k*l)) + 0,  start = list(k = k.l))
  data[i , "kappa.nl"] = coef(temp.nls)
  data[i , "sd.nl"] = coef(summary(temp.nls))[ ,"Std. Error"]

}

Preguntas

Cuando visualizo el resultado obtengo el siguiente gráfico. Surgen estas preguntas:

  • ¿Por qué los ajustes son tan diferentes en torno a la longitud de onda de 400 nm?
  • ¿Cuál se ajusta mejor a los datos?
  • ¿O es que los datos están tan lejos del comportamiento exponencial ahí que tengo que cortarlos donde se encuentran?
  • ¿Cuál de estos modelos es estadísticamente (más) correcto?
  • ¿Puedo mejorar los ajustes añadiendo pesos en función de la incertidumbre de la medición (que creo que es del 5 % según se indica en la web de Vernier)?

el ajuste con valores más altos es el no lineal kappa(lambda)

2voto

kpollock Puntos 1173

Como dije en el descargo de responsabilidad, fue un error tonto. Si hubiera graficado los datos reales sería obvio por qué los modelos no encajan (como cualquier otro modelo exponencial de ese tipo no lo haría).

Probablemente sea un problema del espectrómetro, ya que probablemente no sea lo suficientemente sensible como para captar esa baja trasmitancia, por lo que prácticamente hay ceros para las cinco mediciones, por lo que ajustar una curva exponencial a eso no tiene sentido.

Siento haberles hecho perder el tiempo, chicos.

data visualization detail

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X