Load packages and set plot theme
library(tidyverse)
library(ggthemes)
theme_set(theme_few(base_size = 16))
knitr::opts_chunk$set(fig.width = 6, fig.height = 4, cache = TRUE,
message = FALSE, warn = FALSE)
Set up the two models (\(M_a\) and \(M_b\))
m_a <- function(t, a = .5, epsilon = 0) {
tibble(t = t, y = (1+t)^-a + rnorm(length(t), 0, epsilon))
}
m_b <- function(t, a = .5, b = .3, c = .7, epsilon = 0) {
tibble(t = t, y = (b+c*t)^-a + rnorm(length(t), 0, epsilon))
}
Set up the loss functions for each o the two models using RMSE
loss_a <- function(a, observed_data) {
new_a <- m_a(observed_data$t, a)
sqrt(sum((new_a$y - observed_data$y)^2) / nrow(observed_data))
}
loss_b <- function(par_list, observed_data) {
a <- par_list[1]
b <- par_list[2]
c <- par_list[3]
new_b <- m_b(observed_data$t, a, b, c)
sqrt(sum((new_b$y - a_output$y)^2) / nrow(observed_data))
}
Simulate samples from Model \(M_a\)
Fit model \(M_a\) to the simulated data
a_opt <-optim(par = .3, fn = function(x){loss_a(x, a_output)},
method = "Brent", lower = 0, upper = 10)
a_infer <- m_a(t = a_output$t, a = a_opt$par)
Plot the estimated model \(M_a\)
Fit model \(M_b\) to the simulated data
b_opt <- optim(par = c(.3, .2, .1), fn = function(x){loss_b(x, a_output)})
b_infer <- m_b(t = a_output$t, a = b_opt$par[1], b = b_opt$par[2], c = b_opt$par[3])
Plot the estimated model \(M_b\)
ggplot(a_output,aes(x = t, y= y)) +
geom_point() +
geom_line(data = a_infer, color = "darkred") +
geom_line(data = b_infer, color = "darkblue")
The difference in fit between \(M_a\) and \(M_b\) was 0.0078146