Jaki jest najbardziej bezbolesny sposób dopasowania krzywych wzrostu logistycznego w R?

19

Nie jest to tak łatwe dla Google, jak niektóre inne rzeczy, ponieważ, dla jasności, nie mówię o regresji logistycznej w sensie użycia regresji do przewidywania zmiennych kategorialnych.

Mówię o dopasowaniu logistycznej krzywej wzrostu do danych punktów danych. Mówiąc konkretniej, jest danym rokiem od 1958 do 2012, a jest szacunkowym globalnym ppm CO2 (części na milion dwutlenku węgla) w listopadzie roku .y xxyx

W tej chwili przyspiesza, ale w pewnym momencie musi się wyrównać. Więc chcę krzywą logistyczną.

Nie znalazłem jeszcze stosunkowo prostego sposobu, aby to zrobić.

gotowy15728
źródło
3
Krzywa logistyczna nie jest jedyną krzywą, która „wyrównuje się”. Rzeczywiście wielokrotność dowolnego ciągłego pliku cdf spełniłaby ten wymóg.
Glen_b
2
Użyj pakietu grofit Wykorzystuje krzywe splajnu i wzrostu.
Nick, bardzo dziękuję za ustawienie twojego kodu, zastanawiałem się jak napisać go jako równanie? w kodzie wartości C, a i K odnoszą się do jakich parametrów?
1
Myślę, że zabierasz mnie na @ user2581681. Właśnie zredagowałem ich odpowiedź.
Nick Cox

Odpowiedzi:

19

Zobacz nls()funkcję. Posiada funkcję samoczynnego uruchamiania krzywej logistycznej za pośrednictwem SSlogis(). Np. Ze strony ?nlspomocy

> library("nls")
> DNase1 <- subset(DNase, Run == 1)
>      
> ## using a selfStart model
> fm1DNase1 <- nls(density ~ SSlogis(log(conc), Asym, xmid, scal), 
+                  DNase1)

Sugeruję przeczytanie stron pomocy dla tych funkcji i prawdopodobnie powiązanych odnośników, jeśli to możliwe, aby dowiedzieć się więcej.

Przywróć Monikę - G. Simpson
źródło
9

Przed chwilą miałem to samo pytanie. Oto co znalazłem:

Fox i Weisberg napisali świetny artykuł uzupełniający, korzystając z funkcji nls (zarówno z opcją samoczynnego uruchamiania wymienioną przez Gavina, jak i bez niej). Można go znaleźć tutaj:

http://socserv.mcmaster.ca/jfox/Books/Companion/appendix/Appendix-Nonlinear-Regression.pdf

Z tego artykułu napisałem funkcję dla mojej klasy, która będzie używana podczas dopasowywania krzywej logistycznej do jej danych:

###Log fit - be sure to use quotes around the variable names in the call
log.fit <- function(dep, ind, yourdata){
#Self-starting...

y <- yourdata[, dep]
x <- yourdata[, ind]

log.ss <- nls(y ~ SSlogis(x, phi1, phi2, phi3))

#C
C <- summary(log.ss)$coef[1]
#a
A <- exp((summary(log.ss)$coef[2]) * (1/summary(log.ss)$coef[3]))
#k
K <- (1 / summary(log.ss)$coef[3])

plot(y ~ x, main = "Logistic Function", xlab=ind, ylab=dep)
lines(0:max(x), predict(log.ss, data.frame(x=0:max(x))), col="red")

r1 <- sum((x - mean(x))^2)
r2 <- sum(residuals(log.ss)^2)

r_sq <- (r1 - r2) / r1

out <- data.frame(cbind(c(C=C, a=A, k=K, R.value=sqrt(r_sq))))
names(out)[1] <- "Logistic Curve"

return(out)
}
użytkownik2581681
źródło