Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
19 changes: 11 additions & 8 deletions blog/2026/property-values/index.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ categories: [housing, edmonton, zoning, property value]
description: "Using a first-difference event study design, I find no evidence that nearby multi-unit infill construction reduces property appreciation rates in Edmonton's mature neighbourhoods — and some evidence it slightly accelerates them."
link-external-newwindow: true
link-external-icon: false
draft: false
draft: true
execute:
cache: refresh
---
Expand All @@ -21,9 +21,9 @@ The answer is the same as the preliminary post: **there is no evidence that mult

All data are from Edmonton's open data portal.

- **Historical property assessment data**, 2015–2026. I filter for residential properties (`mill_class_1 == "RESIDENTIAL"`) with positive assessed values. Data for 2015–2024 come from a combined historical RDS; 2025 is a separate GeoJSON; 2026 requires joining a property-information shapefile (geometries) with a separate assessment CSV.
- **General building permit data**, 2009–2025. Filtered using the same criteria as the preliminary post: permits adding ≥1 unit, excluding excavation-only permits.
- **Mature neighbourhood boundaries** (2024 vintage).
- **Historical property assessment data**, 2015–2026. I filter for residential properties (`mill_class_1 == "RESIDENTIAL"`) with positive assessed values. Data for 2015–2024 come from a combined historical RDS; 2025 is a separate GeoJSON; 2026 requires joining a property-information shapefile (geometries) with a separate assessment CSV.
- **General building permit data**, 2009–2025. Filtered using the same criteria as the preliminary post: permits adding ≥1 unit, excluding excavation-only permits.
- **Mature neighbourhood boundaries** (2024 vintage).

The treatment variable follows the preliminary post: a **multi-unit building permit** is one for ≥6 units, excluding new single-family homes, backyard houses, additions/conversions, and duplex-to-fourplex permits. A property is *treated* in assessment year $t$ if such a permit was issued within 50m in year $t - 1$, giving time for the building's presence to be reflected in assessed value.

Expand All @@ -33,7 +33,6 @@ The sample is restricted to mature neighbourhoods (excluding Downtown), where in
#| label: libraries
#| message: false
#| cache: false

library(tidyverse)
library(sf)
library(gt)
Expand Down Expand Up @@ -94,15 +93,19 @@ assessment_values_2026 <- read_csv(

assessment_2026 <- property_info_2026 %>%
inner_join(
assessment_values_2026 %>% select(account_number, assessed_value, mill_class_1),
assessment_values_2026 %>%
select(account_number, assessed_value, mill_class_1),
by = "account_number"
) %>%
mutate(assessment_year = 2026L)

# Combine all years — keep only columns needed for the analysis
analysis_cols <- c(
"account_number", "assessment_year", "assessed_value",
"mill_class_1", "neighbourhood_name"
"account_number",
"assessment_year",
"assessed_value",
"mill_class_1",
"neighbourhood_name"
)
historical <- bind_rows(
historical %>% select(all_of(analysis_cols)),
Expand Down
Loading