In Part 3 and Part 4 we used the lm() command to perform least squares regressions. We saw how to check for non-linearity in our data by fitting polynomial models and checking whether they fit the data better than a linear model. Now let’s see how to fit an exponential model in R.

As before, we will use a data set of counts (atomic disintegration events that take place within a radiation source), taken with a Geiger counter at a nuclear plant.

The counts were registered over a 30 second period for a short-lived, man-made radioactive compound. We read in the data and subtract the background count of 623.4 counts per second in order to obtain

Once again, cut and paste the following data into the R workspace.

```
A <- structure(list(Time = c(0, 1, 2, 4, 6, 8, 9, 10, 11, 12, 13,
14, 15, 16, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30),
Counts = c(126.6, 101.8, 71.6, 101.6, 68.1, 62.9, 45.5, 41.9,
46.3, 34.1, 38.2, 41.7, 24.7, 41.5, 36.6, 19.6,
22.8, 29.6, 23.5, 15.3, 13.4, 26.8, 9.8, 18.8, 25.9, 19.3)), .Names = c("Time", "Counts"), row.names = c(1L, 2L,
3L, 5L, 7L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 19L, 20L, 21L, 22L, 23L, 25L, 26L, 27L, 28L, 29L, 30L,
31L), class = "data.frame")
```

Let’s attach the entire dataset so that we can refer to all variables directly by name.

`attach(A)`

`names(A)`

Let’s see if an exponential function fits the data even better than a quadratic. We set up a grid of points and superpose the exponential function on the previous plot. An exponential function in the Time variable can be treated as a model of the log of the Counts variable.

`exponential.model <- lm(log(Counts)~ Time)`

`summary(exponential.model)`

R returns the following output:

```
Call:
lm(formula = log(Counts) ~ Time)
Residuals:
Min 1Q Median 3Q Max
-0.54715 -0.17618 0.02855 0.18850 0.55254
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.555249 0.111690 40.78 < 2e-16 ***
Time -0.063915 0.006158 -10.38 2.36e-10 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.2814 on 24 degrees of freedom
Multiple R-squared: 0.8178, Adjusted R-squared: 0.8102
F-statistic: 107.7 on 1 and 24 DF, p-value: 2.362e-10
```

This model is pretty good, though it explains about 81% of the variance by comparison with the 89% explained by the quadratic model. Let’s plot it on a grid of time values from 0 to 30 in intervals of 0.1 seconds.

`timevalues <- seq(0, 30, 0.1)`

`Counts.exponential2 <- exp(predict(exponential.model,list(Time=timevalues)))`

`plot(Time, Counts,pch=16)`

`lines(timevalues, Counts.exponential2,lwd=2, col = "red", xlab = "Time (s)", ylab = "Counts")`

Note that we used the exponential of the predicted values in the second line of syntax above.

So – we have fitted our exponential model. For our data the fitted exponential model fits the data less well than the quadratic model, but still looks like a good model.

In Part 6 we will look at some basic plotting syntax.

**About the Author:***David Lillis has taught R to many researchers and statisticians. His company, Sigma Statistics and Research Limited, provides both on-line instruction and face-to-face workshops on R, and coding services in R. David holds a doctorate in applied statistics.*

See our full R Tutorial Series and other blog posts regarding R programming

norman jones says

Your exponential model was made by assuming that the best-fit exponential curve has no vertical or horizontal shift.

If we use a model y=A*exp(k*(t-h))+v

A 24.32223247

k -0.110612853

h 12.99889508

v 14.02693519

this model has a smaller sum of squared differences.

ana says

Hi,

Thank you for your tutorial, very helpful. I would like to ask why the intercept is ~4.55 instead of ~100.

Thanks

Karen Grace-Martin says

Hi Ana,

It’s 4.55 on the log scale. It’s only around 100 once you exponentiate.

Abhishek says

Hi ,

I wanted to plot a exponential graph with some data set (like x= cus_id and y=address_id), but how to do it in R serve .

Could you please help me how can i design exponential regression on this data set in R language.

Thanks,

Abhishek

desp says

hi,

why you didnt use the nls() instead of lm().Iam asking that because exponential models are non-linear models

Alper says

I believe the fitted equation is

log(counts) = 4.555 – log(0.0639)*time

or

counts = e^4.555*(e^-0.0639)^time

or

counts = 95.11*(0.938^time)

evgen says

it is actually

log(counts) = 4.555 – 0.0639*time

counts = e^(4.555 – 0.0639*time)

counts = e^4.555 * (e^-0.0639*time)

counts = e^4.555 * (e^-0.0639)^time

Marina says

Please, would be very helpful if you can confirm that the fitted equation is:

counts = 4.555-log(0.0639)*time

Thank you!

Attia says

Could you please write the equation of this fitted curve. Is it

counts = 4.555-log(0.0639)*time

Thanks

Conor says

Hi,

How would you increase the slope of the fitted curve?