[R] fitting cosine curve

Jim Lemon drjimlemon at gmail.com
Wed Jun 21 01:45:16 CEST 2017


Hi lily,
You can get fairly good starting values just by eyeballing the curves:

plot(y)
lines(supsmu(1:20,y))
lines(0.6*cos((1:20)/3+0.6*pi)+17.2)

Jim


On Wed, Jun 21, 2017 at 9:17 AM, lily li <chocold12 at gmail.com> wrote:
> Hi R users,
>
> I have a question about fitting a cosine curve. I don't know how to set the
> approximate starting values. Besides, does the method work for sine curve
> as well? Thanks.
>
> Part of the dataset is in the following:
> y=c(16.82, 16.72, 16.63, 16.47, 16.84, 16.25, 16.15, 16.83, 17.41, 17.67,
> 17.62, 17.81, 17.91, 17.85, 17.70, 17.67, 17.45, 17.58, 16.99, 17.10)
> t=c(7,  37,  58,  79,  96, 110, 114, 127, 146, 156, 161, 169, 176, 182,
> 190, 197, 209, 218, 232, 240)
>
> I use the method to fit a curve, but it is different from the real curve,
> which can be seen in the figure.
> linFit  <- lm(y ~ cos(t))
> fullFit <- nls(y ~ A*cos(omega*t+C) + B,
> start=list(A=coef(linFit)[1],B=coef(linFit)[2],C=0,omega=.4)) #omega cannot
> be set to 1, don't know why.
> co <- coef(fullFit)
> fit <- function(x, a, b, c, d) {a*cos(b*x+c)+d}
> plot(x=t, y=y)
> curve(fit(x, a=co['A'], b=co['omega'], c=co['C'],d=co['B']), add=TRUE
> ,lwd=2, col="steelblue")
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list