Estimating Parameters of Exponential Decay Model in R: A Case Study on Non-Linear Regression with Dependent Variables as Sums

Estimating Parameters of Exponential Decay Model in R: A Case Study on Non-Linear Regression with Dependent Variables

In this article, we’ll delve into the world of non-linear regression analysis, specifically focusing on estimating parameters for an exponential decay model where dependent variables (DV) are sums of different time-series. We’ll explore how to handle this unique scenario using R, providing a step-by-step guide and practical examples.

Background: Understanding Exponential Decay Models

An exponential decay model is commonly used to describe the relationship between two variables that change over time. The general form of such models can be represented as:

y = β0 * e^(-β1 * x)

where y is the dependent variable, x is the independent variable (time in our case), and β0 and β1 are model parameters to be estimated.

Understanding Dependent Variables and Time-Series

In this article, we’re dealing with a scenario where the dependent variables (DV) are sums of different time-series. For instance, for each participant, there’s an observation over ten seconds, which is then summed up across all participants. This means our DVs are not simply a single value but rather an aggregate of values from multiple observations.

R Code: Defining Data and Initial Explorations

To begin our analysis in R, we’ll first load the necessary libraries and define our data.

# Load required libraries
library(ggplot2)
library(magrittr)

# Define data sets S_t_c and S_11_i_c
S_t_c <- read.table(text = "
time     S_c_1  S_c_2     S_c_3 
1      20    15         40 
2      45    30         50 
3      60    45         60 
4      75    60         60 
5      90    70         60 
6     105    70         90 
7     120    70        120 
8     125    70        140 
9     130    70        160 
10     145    70        180 
           ", header = T)

S_11_i_c <- read.table(text = "
             i     c_1    c_2       c_3 
             1     150    70        190 
             2     155    70        200 
             3     150    75        195 
             4     160    80        190 
             5     150    75        180 
               ", header = T)

Calculating Sums: Combining Data Sets

We’ll now calculate the sums of our DVs across all observations. This step is essential to transform our dependent variables into a format suitable for non-linear regression analysis.

# Function to calculate sum for each car brand
function(s) {
    x = 0
    for (j in 0:9) {
        x <- x + x^j
    }
}

w_s <- beta_2^s / function(beta_2)

Sum_S_t_c <- data.frame(
    s = seq(1:9),
    c_1 = rnorm(9),  
    c_2 = rnorm(9),
    c_3 = rnorm(9)
)

# Calculate sums for each car brand
for (c in 2:4) {
    for (s in 0:9) {  
        Sum_S_t_c[s,c] <- Sum_S_t_c + S_t_c[10-s, c]
        Sum_S_t_c = Sum_S_t_c[s,c]
    }
}

Non-Linear Regression with Dependent Variables as Sums

Now that we have our dependent variables in a suitable format, let’s fit these variables into a non-linear regression model.

# Define the model for each car brand
For (c in 2:4) {
    for (i in 1:5) {
        for (s in 0:9) {    

            S_11_i_c ~ beta_0 + beta_1 \* Sum_S_t_c[s,c] \* beta_2^s / function(beta_2)

        }
    }
}

Setting Upper and Lower Limits for Beta2

To restrict the range of our model parameters, we need to set upper and lower limits for β2. This can be achieved by using the optim() function in R with a custom objective function that includes these constraints.

# Define objective function with beta_2 constraints
objective <- function(par) {
    beta_0 = par[1]
    beta_1 = par[2]
    beta_2 = par[3]

    # Calculate the sum of squared residuals
    ssr = sum((S_11_i_c - (beta_0 + beta_1 \* Sum_S_t_c \* beta_2^s / function(beta_2)))^2)

    # Add penalty terms for beta_2 constraints
    if (beta_2 < 0) {
        return(ssr + 10000)
    } else if (beta_2 > 10) {
        return(ssr + 1000000)
    }

    return(ssr)
}

# Run optimization to find parameters with constrained beta_2
optim(c(1, 1, 5), objective)

Grouping Variables of Two Different Data Tables

If you want to group variables from two different data tables together, it’s possible but requires some creative thinking and careful handling. One approach is to create a master data frame that combines both datasets based on their commonalities (e.g., participant IDs).

Here’s an example using data.table library:

# Load required libraries
library(data.table)

# Define the data tables S_t_c and S_11_i_c as data.tables
S_dt <- data.table(S_t_c)
S_11_dt <- data.table(S_11_i_c)

# Merge the two data.tables based on participant IDs
master_dt <- rbindlist(c(S_dt, S_11_dt))

# Perform grouping and further processing...

In this article, we explored how to estimate parameters for an exponential decay model where dependent variables are sums of different time-series. We used R as our tool for analysis, covering the calculation of sums, non-linear regression with dependent variables in a suitable format, setting upper and lower limits for β2, and grouping variables from two different data tables together.

We hope this practical guide has provided you with a better understanding of how to approach such problems in R.


Last modified on 2024-05-15