Introduction

In this project, our objective was to investigate potential causal relationships between the decline in private car usage and the surge in electricity prices in the post-January 2021 period. Our study was centered on Norway’s three largest cities: Oslo, Bergen, and Trondheim. These cities, situated in diverse regions of the country, introduced a geographical dimension to our research. Furthermore, the cities belong to different electricity bidding areas.

Historical average monthly electricity prices are retrieved from Nord Pool. Willingness to use private cars is expressed through the light cars’ (those with the length <5.6 m, while length >5.6m are considered as “non-private”) monthly traffic in 10 busiest registration points as per Statens vegvesen. The basis for choosing the points is the registered annual average daily traffic (årsdøgntrafikk, ÅDT) in byindex calculations for Oslo, Bergen, and Trondheim. We selected 10 registration points with the highest ÅDT values.

In order to capture the affect of rising electricity prices on private car usage we have conducted a fixed effects linear regression model, with interaction terms between e_crisis (a dummy variable signifying the the event i.e. January 2021) and the months leading to it (time_to_crisis).

Subsequently, we enhanced our model by exploring the interaction between electricity price deviation and the months preceding the crisis.

This paper was written by Syed Amjad Ali & Veronika Priakhina in Spring 2023 as partial requirement of the course titled “ECO433 EMPIRICAL STRATEGIES FOR CAUSAL ANALYSIS” Since then, there have been some minor revisions. Although the results from this project were inconclusive, this serve as a foundation step toward addressing more compelling and significant inquiries concerning transportation usage patterns and their connection to economic phenomena. A few such interesting topics can be explored here

Preparing the Data

Loading Libraries and Initial Cleaning

We have retained the columns “Navn,” which denotes the road’s name, and “Felt,” representing the travel lane utilized by vehicles. Subsequently, we have filtered and preserved data associated with the total vehicle count for all lanes

library(data.table)
library(tidyverse)
library(dplyr)


library(fixest)
library(lubridate)


library(ggiplot)
#
options(repos = "https://cran.r-project.org")
chooseCRANmirror(ind=58)


#We defined a function to load and clean the data
#We have done this to avoid repeatation of codes.

load_and_clean <- function(city_name) {
  city <- fread(paste0(city_name, ".csv"))
  city <- select(city, "Navn", "Fra" ,"Felt","< 5,6m",">= 5,6m")
  city <- city[Felt %like% "Totalt" , ]
  city <- city %>% filter(!grepl('Totalt i retning', Felt))
  city$Fra <- as.Date.character(city$Fra)
  city$Navn <- as.character(city$Navn)
  city_complete <- city %>%
    complete(Navn, Fra = seq.Date(as.Date("2013-01-01"), as.Date("2023-02-01"), by = "month")) %>%
    arrange(Navn)
  return(city_complete)
}

# Load and preprocess data for Bergen, Oslo, and Trondheim
bergen_complete <- load_and_clean("Bergen")
oslo_complete <- load_and_clean("Oslo")
trondheim_complete <- load_and_clean("Trondheim")

head(bergen_complete)
## # A tibble: 6 × 5
##   Navn             Fra        Felt   `< 5,6m` `>= 5,6m`
##   <chr>            <date>     <chr>  <chr>    <chr>    
## 1 DAMSG�RDTUNNELEN 2013-01-01 Totalt 35593    3096     
## 2 DAMSG�RDTUNNELEN 2013-02-01 Totalt 36446    3168     
## 3 DAMSG�RDTUNNELEN 2013-03-01 Totalt 34419    2909     
## 4 DAMSG�RDTUNNELEN 2013-04-01 Totalt 38307    3419     
## 5 DAMSG�RDTUNNELEN 2013-05-01 Totalt 37013    3342     
## 6 DAMSG�RDTUNNELEN 2013-06-01 Totalt 37789    3665

Adding Dummy Variables to our data

Here, we added two dummy variables, e_crisis and e_treat. Also, vehicles with lengths less than 5.6m are classified as Private and those above 5.6m are classified as NonPrivate.

# We made a function which adds two dummy variables to the data
# e_crisis, this is 1 if the date is after January 2021, 0 otherwise
#e_treat is another dummy variable that identifies if any data point within a group (grouped by 'Navn') is part of the treatment group (has e_crisis equal to 1) or not (has e_crisis equal to 0). It helps distinguish which groups or observations were affected by the crisis.

dummy_maker <- function(city_data) {
  city_data$e_crisis <- as.integer(city_data$Fra >= "2021-01-01")
  setDT(city_data)
  city_data[, e_treat := max(e_crisis, na.rm = TRUE), by = .(Navn)]
  city_data$Fra <- as.Date(city_data$Fra)
  city_data[, begin_crisis := min(Fra[e_crisis == 1], na.rm = TRUE), by = .(Navn)]
  city_data[, time_to_crisis := ifelse(e_treat == 1, as.numeric(Fra - begin_crisis) / days_in_month(Fra), 0)]
  city_data[, time_to_crisis := round(time_to_crisis)]
  city_data$numroad <- match(city_data$Navn, unique(city_data$Navn))
  names(city_data)[names(city_data) == "< 5,6m"] <- "Private"
  names(city_data)[names(city_data) == ">= 5,6m"] <- "NonPrivate"
  return(city_data)
}

# Preprocess data for Bergen, Oslo, and Trondheim
bergen_complete <- dummy_maker(bergen_complete)
oslo_complete <- dummy_maker(oslo_complete)
trondheim_complete <- dummy_maker(trondheim_complete)


head(bergen_complete)
##                   Navn        Fra   Felt Private NonPrivate e_crisis e_treat
## 1: DAMSG\xc5RDTUNNELEN 2013-01-01 Totalt   35593       3096        0       1
## 2: DAMSG\xc5RDTUNNELEN 2013-02-01 Totalt   36446       3168        0       1
## 3: DAMSG\xc5RDTUNNELEN 2013-03-01 Totalt   34419       2909        0       1
## 4: DAMSG\xc5RDTUNNELEN 2013-04-01 Totalt   38307       3419        0       1
## 5: DAMSG\xc5RDTUNNELEN 2013-05-01 Totalt   37013       3342        0       1
## 6: DAMSG\xc5RDTUNNELEN 2013-06-01 Totalt   37789       3665        0       1
##    begin_crisis time_to_crisis numroad
## 1:   2021-01-01            -94       1
## 2:   2021-01-01           -103       1
## 3:   2021-01-01            -92       1
## 4:   2021-01-01            -94       1
## 5:   2021-01-01            -90       1
## 6:   2021-01-01            -92       1

Loading Electricity Prices

First we load and clean the electricity data acquired from NordPool

library(readxl)
electric<-read_xlsx("Electricity-prices.xlsx")

#The Data acquired has Column names in Norwegian.
#We convert the the data according to our needs

# Define a function to merge and process data for a city
merge_process_data <- function(city_data, city_name, col_index) {
  colnames(electric)[col_index] <- paste(city_name, "price", sep = "_")
  electric$Fra <- as.Date(electric$Fra)
  merged_data <- merge(city_data, electric[, c("Fra", paste(city_name, "price", sep = "_"))], by = "Fra")
  merged_data$Private <- as.integer(merged_data$Private)
  merged_data$NonPrivate <- as.integer(merged_data$NonPrivate)
  return(merged_data)
}

# Process data for Bergen, Oslo, and Trondheim
bergen_complete <- merge_process_data(bergen_complete, "Bergen", 7) #col7 in electric
oslo_complete <- merge_process_data(oslo_complete, "Oslo", 5)       #col5 in electric
trondheim_complete <- merge_process_data(trondheim_complete, "Trondheim", 6) #col6 in electric

head(bergen_complete)
##           Fra                                  Navn   Felt Private NonPrivate
## 1: 2013-01-01                   DAMSG\xc5RDTUNNELEN Totalt   35593       3096
## 2: 2013-01-01        Danmarks plass ved ladestasjon   <NA>      NA         NA
## 3: 2013-01-01                 FJ\xd8SANGER V/BOMST. Totalt   40883       3884
## 4: 2013-01-01 Fl\xf8yfjellstunnelen s\xf8rg\xe5ende Totalt      NA         NA
## 5: 2013-01-01                         H\xc5VARDSTUN Totalt   25040       1973
## 6: 2013-01-01                     HARAFJELLTUNNELEN Totalt   26156       2028
##    e_crisis e_treat begin_crisis time_to_crisis numroad Bergen_price
## 1:        0       1   2021-01-01            -94       1        38.92
## 2:        0       1   2021-01-01            -94       2        38.92
## 3:        0       1   2021-01-01            -94       3        38.92
## 4:        0       1   2021-01-01            -94       4        38.92
## 5:        0       1   2021-01-01            -94       5        38.92
## 6:        0       1   2021-01-01            -94       6        38.92

After the step above, we explored the idea of imputing the missing values in the electricity data using the mice package. However, ultimately decided against this step.

We then add Dev_Price columns which is basically the deviation between the prices after the event date i.e. January 2021 and the mean of the prices between 2013 and 2021. After which , we create the all_cities data frame which has data for all cities combined.

# We will now create a function which will calculate and find deviation from mean electricity price for  each city's electricity price.

electricity_deviation <- function(city_data, price_col, date_range_start, date_range_end) {
  # Calculate the mean price within the specified date range
  mean_price <- mean(city_data[[price_col]][as.Date(city_data$Fra) >= date_range_start & as.Date(city_data$Fra) < date_range_end], na.rm = TRUE)
  
  # Convert the price column to numeric
  city_data[[price_col]] <- as.numeric(city_data[[price_col]])
  
  # Calculate and add deviation
  city_data$Dev_Price <- city_data[[price_col]] - mean_price
  
  return(city_data)
}

# Calculate and add deviation for Bergen
bergen_complete <- electricity_deviation(bergen_complete, "Bergen_price", "2013-01-01", "2021-02-01")

# Calculate and add deviation for Oslo
oslo_complete <- electricity_deviation(oslo_complete, "Oslo_price", "2013-01-01", "2021-02-01")

# Calculate and add deviation for Trondheim
trondheim_complete <- electricity_deviation(trondheim_complete, "Trondheim_price", "2013-01-01", "2021-02-01")



bergen_complete$city <- "bergen"
oslo_complete$city <- "oslo"
trondheim_complete$city <- "trondheim"

all_cities <- bind_rows(bergen_complete, oslo_complete, trondheim_complete) %>%
  select(Fra, Navn, Private, NonPrivate, e_crisis, e_treat, 
         time_to_crisis, numroad, Dev_Price, city)

setDT(all_cities)

# Arrange data frame by the Fra column
all_cities <- all_cities %>% arrange(Fra)

head(all_cities)
##           Fra                                  Navn Private NonPrivate e_crisis
## 1: 2013-01-01                   DAMSG\xc5RDTUNNELEN   35593       3096        0
## 2: 2013-01-01        Danmarks plass ved ladestasjon      NA         NA        0
## 3: 2013-01-01                 FJ\xd8SANGER V/BOMST.   40883       3884        0
## 4: 2013-01-01 Fl\xf8yfjellstunnelen s\xf8rg\xe5ende      NA         NA        0
## 5: 2013-01-01                         H\xc5VARDSTUN   25040       1973        0
## 6: 2013-01-01                     HARAFJELLTUNNELEN   26156       2028        0
##    e_treat time_to_crisis numroad Dev_Price   city
## 1:       1            -94       1  5.911856 bergen
## 2:       1            -94       2  5.911856 bergen
## 3:       1            -94       3  5.911856 bergen
## 4:       1            -94       4  5.911856 bergen
## 5:       1            -94       5  5.911856 bergen
## 6:       1            -94       6  5.911856 bergen

Electricity Price Plots

library(ggplot2)



# Define common colors and labels
city_colors <- c("bergen" = "blue", "oslo" = "green", "trondheim" = "red")
city_labels <- c("bergen" = "Bergen", "oslo" = "Oslo", "trondheim" = "Trondheim")


ggplot(electric, aes(x = Fra)) +
  geom_line(aes(y = `Sørøst-Norge - Oslo (NO1)`, color = "oslo")) +
  geom_line(aes(y = `Midt-Norge - Trondheim (NO3)`, color = "trondheim")) +
  geom_line(aes(y = `Vest-Norge - Bergen (NO5)`, color = "bergen")) +
  geom_vline(xintercept = as.numeric(as.Date("2021-01-01")), linetype = "dashed", color = "black") +
  labs(x = "", y = "Electricity price", color = "City") +
  scale_color_manual(values = city_colors) +  # Use the common color scale
  theme(legend.position = "top",
        legend.title = element_text(size = 18), 
        legend.text = element_text(size = 16),
        axis.title = element_text(size = 16, face = "bold")) +
  theme(plot.title = element_text(size = 20),
        plot.subtitle = element_text(size = 16),
        axis.text = element_text(size = 16))

# Plot deviation of electricity prices for the three cities
ggplot(all_cities, aes(x = Fra, y = Dev_Price, color = city)) +
  geom_line() +
  geom_vline(xintercept = as.numeric(as.Date("2021-01-01")), linetype="dashed") +
  labs(x = "", y = "Deviation above pre-January 2021 Mean") +
  scale_color_manual(values = city_colors) +  # Use the common color scale
  scale_fill_manual(values = city_colors) +   # Add scale_fill for consistency
  theme_bw() +
  theme(legend.position = "top",  # Move the legend to the top
        legend.title = element_text(size = 18),
        legend.text = element_text(size = 16),
        axis.title = element_text(size = 16, face = "bold"),
        axis.text = element_text(size = 16),  
        plot.title = element_text(size = 20),
        plot.subtitle = element_text(size = 16))

In these plots, we present a visual representation of electricity price trends, both in their raw form and as deviations from the mean, spanning several years. These visuals offer insights into the dynamic nature of electricity prices across the selected cities.

Fixed Effect OLS (Event-Study)

Initial Model

Our initial model represents an ‘Event Study.’ In this analysis, we employ a fixed-effects regression model to control for time-invariant factors specific to each city. Of particular significance is the interaction term within our model. Additionally, we cluster the standard errors based on road categories. Our primary focus is on a specific time window: 40 months leading up to the event and 27 months following the event. In this context, the event we are investigating occurred in January 2021.

The regression equation guiding our analysis is formulated as follows:

\[ Private = \beta_0 + \beta_1 \cdot Bergen\_price + \beta_2 \cdot e\_crisis + \beta_3 \cdot factor(numroad) + \beta_4 \cdot i(time\_to\_crisis, ref = -1) + \beta_5 \cdot e\_crisis \cdot time\_to\_crisis + \epsilon \] Where: - \(Private\) is the dependent variable (private car usage). - \(Bergen\_price\) is the independent variable representing Bergen’s electricity prices. - \(e\_crisis\) is a dummy variable for the crisis event. - \(factor(numroad)\) represents fixed effects for different roads. - \(i(time\_to\_crisis, ref = -1)\) represents a term involving time to the crisis event. - \(e\_crisis \cdot time\_to\_crisis\) represents the interaction effect between the crisis dummy and time to the crisis event. - \(\epsilon\) represents the error term.

library(ggiplot)
library(lmtest)
library(sandwich)

oslo_complete$Private<-as.integer(oslo_complete$Private)
trondheim_complete$Private<-as.integer(trondheim_complete$Private)

#bergen
model_bergen <- feols((Private) ~ Bergen_price + e_crisis + factor(numroad) + i(time_to_crisis, ref = -1) +  e_crisis * time_to_crisis, cluster = ~numroad, data = bergen_complete[time_to_crisis %in% c(-40:27)])

model_bergen %>%
  ggiplot(
    ref.line = -1,
    geom_style = "ribbon"
  ) +
  labs(
    x = "Time to event",
    title = "Event study",
    subtitle = "Effect of Surge in Electricity Prices on Private Car Usage in Bergen"
  ) +
  theme_minimal()+
   theme(
    plot.title = element_text(size = 20),
    plot.subtitle = element_text(size = 16),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 12)
  )

#oslo


model_oslo <- feols((Private) ~ Oslo_price + e_crisis + factor(numroad) + i(time_to_crisis, ref = -1) +  e_crisis * time_to_crisis, cluster = ~numroad, data = oslo_complete[time_to_crisis %in% c(-40:27)])


model_oslo %>%
  ggiplot(
    ref.line = -1,
    geom_style = "ribbon"
  ) +
  labs(
    x = "Time to event",
    title = "Event study",
    subtitle = "Effect of Surge in Electricity Prices on Private Car Usage in Oslo"
  ) +
  theme_minimal()+
   theme(
    plot.title = element_text(size = 20),
    plot.subtitle = element_text(size = 16),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 12)
  )

#trondheim


model_trondheim <- feols((Private) ~ Trondheim_price + e_crisis + factor(numroad) + i(time_to_crisis, ref = -1) +  e_crisis * time_to_crisis, cluster = ~numroad, data = trondheim_complete[time_to_crisis %in% c(-40:27)])

model_trondheim %>%
ggiplot(
ref.line = -1,
geom_style = "ribbon"
) +
labs(
x = "Time to event",
title = "Event study",
subtitle = "Effect of Surge in Electricity Prices on Private Car Usage in Trondheim"
) +
theme_minimal()+
  theme(
    plot.title = element_text(size = 20),
    plot.subtitle = element_text(size = 16),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 12)
  )

While it is tempting to draw conclusions based on the declining trend observed in Oslo and Bergen, particularly considering that these two cities experienced the most significant spikes in electricity prices, it’s essential to exercise caution when drawing conclusions.

Improved Model

We will now enhance our model to investigate the collective effect across all three cities. In this refined analysis, we narrow down our independent variables to focus solely on the interaction between price deviation (Dev_Price) and the months leading up to the crisis (time_to_crisis).

The regression equation guiding our investigation is as follows:

\[ \text{Private} = \beta_0 + \beta_1 \cdot \text{Dev_Price} \cdot \text{time_to_crisis} + \beta_2 \cdot \text{i(time_to_crisis, ref = -1)} + \epsilon \]

Where: - \(\beta_0\) represents the intercept. - \(\beta_1\) represents the coefficient for the interaction between Dev_Price and time_to_crisis. - \(\beta_2\) represents the coefficient for the factor variable time_to_crisis. - \(\epsilon\) represents the error term.

all_cities_subset <- subset(all_cities, time_to_crisis %in% c(-40:27))

model_fe<-feols(Private ~ Dev_Price * time_to_crisis+i(time_to_crisis, ref = -1)
      | numroad + city, 
      data = all_cities_subset)


model_fe %>% 
  ggiplot(
    ref.line = -1,
    geom_style = "ribbon"
  ) +
  labs(
    x = "Time to crisis",
    title = "Event study",
    subtitle = "Effect of Surge in Electricity Prices on Private Car Usage across cities"
  ) +
  theme_minimal()+
  theme(
    plot.title = element_text(size = 20),
    plot.subtitle = element_text(size = 16),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 12)
  )

Result

summary(model_fe)
## OLS estimation, Dep. Var.: Private
## Observations: 1,792 
## Fixed-effects: numroad: 10,  city: 3
## Standard-errors: Clustered (numroad) 
##                             Estimate Std. Error   t value   Pr(>|t|)    
## Dev_Price                  -32.37678   24.25317 -1.334950 2.1468e-01    
## time_to_crisis             132.77933   65.17948  2.037134 7.2098e-02 .  
## time_to_crisis::-40      11879.58519 3325.79850  3.571950 6.0059e-03 ** 
## time_to_crisis::-39      11313.18692 3404.48316  3.323026 8.8973e-03 ** 
## time_to_crisis::-38      10566.12509 3287.71783  3.213817 1.0594e-02 *  
## time_to_crisis::-36       7986.71396 3241.83763  2.463638 3.5943e-02 *  
## time_to_crisis::-35       7931.60530 3174.31822  2.498680 3.3935e-02 *  
## time_to_crisis::-34      11798.49313 2758.56850  4.277035 2.0589e-03 ** 
## time_to_crisis::-33       9306.82266 2876.67699  3.235269 1.0236e-02 *  
## time_to_crisis::-32      14188.59540 2525.34129  5.618486 3.2646e-04 ***
## time_to_crisis::-31      10524.64875 2624.42028  4.010276 3.0626e-03 ** 
## time_to_crisis::-30       7004.43972 2356.74140  2.972087 1.5649e-02 *  
## time_to_crisis::-29      13336.81545 2288.88304  5.826779 2.5093e-04 ***
## time_to_crisis::-28      13080.86646 2538.26800  5.153462 6.0034e-04 ***
## time_to_crisis::-27      12201.48841 2252.11172  5.417799 4.2305e-04 ***
## time_to_crisis::-26      12339.28775 2333.10713  5.288779 5.0124e-04 ***
## time_to_crisis::-25       9602.44850 2417.19376  3.972561 3.2421e-03 ** 
## time_to_crisis::-24       9753.44184 2592.43061  3.762277 4.4693e-03 ** 
## time_to_crisis::-22      10352.14592 2285.97526  4.528547 1.4292e-03 ** 
## time_to_crisis::-21       8922.44845 2228.50022  4.003791 3.0927e-03 ** 
## time_to_crisis::-20      10552.96238 2111.56164  4.997705 7.4129e-04 ***
## time_to_crisis::-19      10292.65580 1748.89811  5.885223 2.3331e-04 ***
## time_to_crisis::-18       5244.21711 2106.08291  2.490034 3.4420e-02 *  
## time_to_crisis::-17      10785.18257 1984.01534  5.436038 4.1311e-04 ***
## time_to_crisis::-16      10890.33415 2139.78312  5.089457 6.5441e-04 ***
## time_to_crisis::-15      10561.30661 1847.82360  5.715538 2.8858e-04 ***
## time_to_crisis::-14       9177.89944 1776.06895  5.167536 5.8911e-04 ***
## time_to_crisis::-13       5894.45488 1604.12059  3.674571 5.1184e-03 ** 
## time_to_crisis::-12       5720.18735 1574.22998  3.633641 5.4546e-03 ** 
## time_to_crisis::-10      -3212.21606 1670.13201 -1.923331 8.6593e-02 .  
## time_to_crisis::-9       -4024.02081 1762.45512 -2.283191 4.8310e-02 *  
## time_to_crisis::-8        1077.26838 1450.42648  0.742725 4.7659e-01    
## time_to_crisis::-7        5280.07721 1270.03019  4.157442 2.4570e-03 ** 
## time_to_crisis::-6         973.67058 1345.29884  0.723758 4.8760e-01    
## time_to_crisis::-5        4583.01761 1011.02331  4.533048 1.4200e-03 ** 
## time_to_crisis::-4        5609.44912  803.63350  6.980109 6.4653e-05 ***
## time_to_crisis::-3        4848.43819  657.80482  7.370633 4.2333e-05 ***
## time_to_crisis::-2         102.76136  675.45454  0.152137 8.8244e-01    
## time_to_crisis::0        -2331.22851 1009.11862 -2.310163 4.6224e-02 *  
## time_to_crisis::1          137.37567 1173.20412  0.117094 9.0936e-01    
## time_to_crisis::2          751.07083  758.60766  0.990065 3.4801e-01    
## time_to_crisis::3          910.74596  790.23122  1.152506 2.7881e-01    
## time_to_crisis::4         3086.12674  936.47833  3.295460 9.2970e-03 ** 
## time_to_crisis::5         6795.42037 1331.05227  5.105299 6.4055e-04 ***
## time_to_crisis::6         3170.47717 1451.95558  2.183591 5.6841e-02 .  
## time_to_crisis::7         7939.75892 1767.25810  4.492699 1.5047e-03 ** 
## time_to_crisis::8         8587.01566 1919.20577  4.474255 1.5452e-03 ** 
## time_to_crisis::9         7027.32459 1487.10902  4.725494 1.0807e-03 ** 
## time_to_crisis::10        6673.11449 1453.91813  4.589746 1.3095e-03 ** 
## time_to_crisis::11        2488.21513 2319.18050  1.072885 3.1125e-01    
## time_to_crisis::12         193.19147 1563.68068  0.123549 9.0439e-01    
## time_to_crisis::14        3798.70533 1491.99757  2.546053 3.1397e-02 *  
## time_to_crisis::15        3679.58142 1598.67472  2.301645 4.6873e-02 *  
## time_to_crisis::16        5908.28774 1379.63768  4.282492 2.0425e-03 ** 
## time_to_crisis::17        6993.14290 1261.52288  5.543413 3.5946e-04 ***
## time_to_crisis::18        -746.90883 1180.73321 -0.632581 5.4274e-01    
## time_to_crisis::19        3793.89352 1892.94503  2.004228 7.6033e-02 .  
## time_to_crisis::20        2015.72497 1802.76324  1.118131 2.9247e-01    
## time_to_crisis::21        2287.95055  404.15876  5.661019 3.0923e-04 ***
## time_to_crisis::22        2194.37044  460.44856  4.765723 1.0215e-03 ** 
## time_to_crisis::23       -4391.59869 1934.58078 -2.270052 4.9359e-02 *  
## time_to_crisis::24       -2377.76870  757.26038 -3.139962 1.1929e-02 *  
## Dev_Price:time_to_crisis     2.07267    1.24881  1.659718 1.3134e-01    
## ... 1 variable was removed because of collinearity (time_to_crisis::27)
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## RMSE: 7,713.3     Adj. R2: 0.80468 
##                 Within R2: 0.132213

The estimated coefficient for Dev_Price is -32.37678, and it is not statistically significant (p-value = 0.21468). This suggests that changes in electricity prices, specifically a unit increase in electricity price rise above their pre-January 2021 mean, were not associated with a significant change in the volume of private cars on the roads.

It’s important to note that although the model includes variables theoretically linked to the outcome variable, a strong case for causality cannot be established. The coefficients do not exhibit a clear pattern pre- and post-January 2021, as shown in the figure. Furthermore, the data used for this analysis was purely observational, and no controlled experiments were conducted. This limitation further restricts our ability to draw causal conclusions.

Conclusion

In this mini project, we tried to answer the question about the existence of causality between increased electricity prices and the use of private cars in Norway. The results of the event study imply that in a country where every fifth car is electric, there might be an inverse relationship between the cost of electricity and willingness to use private transport, although not as strong as anticipated. Even though the estimated coefficient is statistically significant, the effect of surged electricity costs on traffic is relatively small. This fact, along with the observational nature of data we have analyzed, does not allow us to claim that causality really exists.