El post de Fred Senese es un excelente punto de partida. Quería añadir que transformar los datos de esta manera es conceptualmente muy útil, pero distorsiona las estimaciones de los parámetros debido a la ponderación desigual de la incertidumbre de los puntos de datos.
La incertidumbre de sus puntos de datos "cero" no es probablemente despreciable. ¿Cómo se puede leer exactamente su aparato de medición de gases? ¿Con una precisión de 0,1 mL, o de 1 mL, o...? Digamos que fue 0,1 mL, entonces su punto de datos "cero" en mL es $0 \pm 0.1 \text{ mL}$ . Y su punto de datos de 70 mL es $70 \pm 0.1 \text{ mL}$ . Sin embargo, cuando se transforman los datos tomando el logaritmo, la incertidumbre de los datos se ve afectada de forma desigual. La incertidumbre de $\ln \left( 0 \pm 0.1 \text{ mL} \right)$ es aproximadamente $\ln{0.1} - \ln{0}$ que como estás descubriendo es infinito. La incertidumbre en el espacio logarítmico de su punto de datos de 70 mL es $\ln{70.1} - \ln{70}$ que es 0,0014. ¡Por lo tanto, aunque la incertidumbre en cada punto de datos era la "misma" antes de los logaritmos, digamos 0,1 mL, después de la transformación la incertidumbre es tan desigual como puede serlo (infinito frente a 0,0014)!
El ajuste no lineal directo puede ajustar los parámetros a los datos sin necesidad de transformaciones. A continuación se muestran algunos R
para realizar el ajuste de sus datos. Debido a la cuestión relacionada con mi comentario, tuve que incluir un parámetro de desplazamiento. (Una ecuación exponencial tiende a un valor positivo a medida que t se acerca a cero, no a cero... a menos que haya un desplazamiento). Este método es probablemente exagerado para tu problema o curso en particular, pero quería incluirlo en caso de que sea útil para otros lectores de chem.se.
#read the data from the question into R and put it in a data frame
g <- as.numeric(str_split('_0___0___0_____5___10___18____22___28___36___44___51____60____70___', '_{1,5}')[[1]]); g <- g[!is.na(g)]
t <- as.numeric(str_split('0___5___10___15___20___25___30___35___40___45___50___55___60 ____', '___')[[1]]); t <- t[!is.na(t)]
dat <- data.frame(g = g, t = t)
# scale the data to avoid numeric problems taking the exponential of large numbers
dat$g.scaled <- dat$g/max(dat$g)
dat$t.scaled <- dat$t/max(dat$t)
#compare to fitting result by neglecting first three zero points and taking logarithm
dat$ln.g[4:13] <- log(dat$g)
lm(formula = ln.g ~ t, data = dat)
# show data
dat
g t g.scaled t.scaled
1 0 0 0.00000000 0.00000000
2 0 5 0.00000000 0.08333333
3 0 10 0.00000000 0.16666667
4 5 15 0.07142857 0.25000000
5 10 20 0.14285714 0.33333333
6 18 25 0.25714286 0.41666667
7 22 30 0.31428571 0.50000000
8 28 35 0.40000000 0.58333333
9 36 40 0.51428571 0.66666667
10 44 45 0.62857143 0.75000000
11 51 50 0.72857143 0.83333333
12 60 55 0.85714286 0.91666667
13 70 60 1.00000000 1.00000000
#do direct nonlinear fitting
fit <- nls(g.scaled ~ A0*exp(k*t.scaled)+offset,
data = dat, start = list(A0 = 1, k = 1, offset = 1))
#do logspace fitting to linear equation by transformation and neglecting first three data points
dat$ln.g[4:13] <- log(dat$g[4:13])
logfit <- lm(ln.g ~ t, data = dat)
#compare predicted values from fit to real data
dat$pred.scaled <- predict(fit)
dat$pred <- dat$pred.scaled * max(g)
dat$logpred[4:13] <- exp(predict(logfit))
require(ggplot2)
ggplot(data = dat, aes(x = t)) + geom_point(aes(y = g)) + geom_line(aes(y=pred), color = 'blue') + geom_line(aes(y=logpred), color = 'red')
![Plot produced by ggplot command]()
La curva azul es el ajuste no lineal directo y la curva roja es el ajuste lineal de los datos transformados logarítmicamente (eliminando los tres primeros puntos de datos).
La constante de velocidad obtenida es muy diferente en los dos casos. Para el ajuste no lineal directo, la constante de velocidad es $1.4 \text{ hr}^{-1}$ y para los datos transformados logarítmicamente con ajuste lineal, la constante de velocidad es $0.053 \text{ min}^{-1}$ o $3.2 \text{ hr}^{-1}$ ¡!