RBS
RBS

Reputation: 105

How to smooth non-linear regression curve in R

So I'm asked to obtain an estimate theta of the variable Length in the MASS package. The code I used is shown below, as well as the resulting curve. Somehow, I don't end up with a smooth curve, but with a very "blocky" one, as well as some lines between points on the curve. Can anyone help me to get a smooth curve?

utils::data(muscle,package = "MASS")
Length.fit<-nls(Length~t1+t2*exp(-Conc/t3),muscle,
                start=list(t1=3,t2=-3,t3=1))
plot(Length~Conc,data=muscle)
lines(muscle$Conc, predict(Length.fit))

Image of the plot: enter image description here .

Edit: as a follow-up question: If I want to more accurately predict the curve, I use nonlinear regression to predict the curve for each of the 21 species. This gives me a vector

theta=(T11,T12,...,T21,T22,...,T3).

I can create a for-loop that plots all of the graphs, but like before, I end up with the blocky curve. However, seeing as I have to plot these curves as follows:

for(i in 1:21) {
  lines(muscle$Conc,theta[i]+theta[i+21]*
        exp(-muscle$Conc/theta[43]), col=color[i])
  i = i+1
}

I don't see how I can use the same trick to smooth out these curves, since muscle$Conc still only has 4 values.

Edit 2: I figured it out, and changed it to the following:

lines(seq(0,4,0.1),theta[i]+theta[i+21]*exp(-seq(0,4,0.1)/theta[43]), col=color[i])

Upvotes: 0

Views: 1193

Answers (1)

eipi10
eipi10

Reputation: 93761

If you look at the output of cbind(muscle$Conc, predict(Length.fit)), you'll see that many points are repeated and that they're not sorted in order of Conc. lines just plots the points in order and connects the points, giving you multiple back-and-forth lines. The code below runs predict on a unique set of ordered values for Conc.

plot(Length ~ Conc,data=muscle)
lines(seq(0,4,0.1),
      predict(Length.fit, newdata=data.frame(Conc=seq(0,4,0.1))))

enter image description here

Upvotes: 4

Related Questions