breaks = c(0, 0.1, 0.25, 0.50, 0.75, 0.90, 0.99, 1),
labels = c("0-10%", "10-25%", "25-50%", "50-75%", "75-90%", "90-99%", "99-100%"),
include.lowest = TRUE
)
# Mean per bin
tapply(dt$y_labor, dt$bin, mean, na.rm = TRUE)
probs <- c(0, 0.10, 0.25, 0.50, 0.75, 0.90, 0.99, 1)
labels <- c("0-10%", "10-25%", "25-50%", "50-75%", "75-90%", "90-99%", "99-100%")
quantile(dt$y_labor_tt, probs = probs, label=labels, na.rm = TRUE)
# Compute percentiles for each observation
dt$percentile <- rank(dt$y_labor_tt, na.last = "keep") / sum(!is.na(dt$y_labor_tt))
# Bin into labeled intervals
dt$bin <- cut(
dt$percentile,
breaks = c(0, 0.1, 0.25, 0.50, 0.75, 0.90, 0.99, 1),
labels = c("0-10%", "10-25%", "25-50%", "50-75%", "75-90%", "90-99%", "99-100%"),
include.lowest = TRUE
)
# Mean per bin
tapply(dt$y_labor_tt, dt$bin, mean, na.rm = TRUE)
rm(labels)
rm(probs)
gc()
probs <- c(0, 0.10, 0.25, 0.50, 0.75, 0.90, 0.99, 1)
labels <- c("0-10%", "10-25%", "25-50%", "50-75%", "75-90%", "90-99%", "99-100%")
quantile(dt$agg_mv, probs = probs, label=labels, na.rm = TRUE)
# Compute percentiles for each observation
dt$percentile <- rank(dt$agg_mv, na.last = "keep") / sum(!is.na(dt$agg_mv))
# Bin into labeled intervals
dt$bin <- cut(
dt$percentile,
breaks = c(0, 0.10, 0.25, 0.50, 0.75, 0.90, 0.99, 1),
labels = c("0-10%", "10-25%", "25-50%", "50-75%", "75-90%", "90-99%", "99-100%"),
include.lowest = TRUE
)
# Mean per bin
tapply(dt$agg_mv, dt$bin, mean, na.rm = TRUE)
probs <- c(0, 0.10, 0.25, 0.50, 0.75, 0.90, 0.99, 1)
labels <- c("0-10%", "10-25%", "25-50%", "50-75%", "75-90%", "90-99%", "99-100%")
quantile(dt$vermoegen_uebriges, probs = probs, label=labels, na.rm = TRUE)
# Compute percentiles for each observation
dt$percentile <- rank(dt$vermoegen_uebriges, na.last = "keep") / sum(!is.na(dt$vermoegen_uebriges))
# Bin into labeled intervals
dt$bin <- cut(
dt$percentile,
breaks = c(0, 0.1, 0.25, 0.50, 0.75, 0.90, 0.99, 1),
labels = c("0-10%", "10-25%", "25-50%", "50-75%", "75-90%", "90-99%", "99-100%"),
include.lowest = TRUE
)
# Mean per bin
tapply(dt$vermoegen_uebriges, dt$bin, mean, na.rm = TRUE)
rm(dt)
rm(labels)
rm(probs)
get_inequality_stats <- function(x) {
x <- x[!is.na(x)]
p90 <- quantile(x, 0.9, names = FALSE)
p50 <- quantile(x, 0.5, names = FALSE)
p10 <- quantile(x, 0.1, names = FALSE)
data.table(
Gini = gini_numeric(x),
P90_P10 = ifelse(p10 == 0, NA_real_, p90 / p10),
P90_P50 = ifelse(p50 == 0, NA_real_, p90 / p50)
)
}
# "Manual" Gini coefficient calculator operating on a numeric vector.
gini_numeric <- function(x) {
x <- sort(x[!is.na(x)])
n <- length(x)
if (n <= 1) return(NA_real_)
sum((2 * seq_len(n) - n - 1) * x) / (n * sum(x))
}
vars_benchmark <- c("y_labor", "y_labor_tt", "y_disp", "y_inflows", "agg_mv", "fin_wealth", "consum")
lapply(vars_benchmark, function(v) {
stats <- get_inequality_stats(dt[[v]])
stats[, Variable := v]
stats
})
gc()
dt = dt_consum_equivalized
lapply(vars_benchmark, function(v) {
stats <- get_inequality_stats(dt[[v]])
stats[, Variable := v]
stats
})
dt = dt_consum_sr_oc
lapply(vars_benchmark, function(v) {
stats <- get_inequality_stats(dt[[v]])
stats[, Variable := v]
stats
})
dt_homeowners = dt[dummy_homeowner == 1]
get_inequality_stats(dt_homeowners$agg_mv)
dt_working = dt_consum_sr_oc[ahv_iv_d == 0 & ahv_iv_p == 0 & bvg_d == 0 & bvg_p == 0]
rm(dt)
gc()
dt_working[, age_group := cut(age,
breaks = c(24, 35, 45, 55, 65),
labels = c("25-35", "36-45", "46-55", "56-65"),
right = TRUE
)]
dt_working[, age_group := factor(age_group, levels = c("25-35", "36-45", "46-55", "56-65"))]
ylabortt_median <- median(dt_working$y_labor_tt, na.rm = TRUE)
dt_working[, ylabortt_group := fifelse(
!is.na(y_labor_tt) & y_labor_tt <= ylabortt_median,
"Below/At Median",
fifelse(!is.na(y_labor_tt), "Above Median", NA_character_)
)]
consum_median <- median(dt_working$consum, na.rm = TRUE)
dt_working[, consum_group := fifelse(
!is.na(consum) & consum <= consum_median,
"Below/At Median",
fifelse(!is.na(consum), "Above Median", NA_character_)
)]
result_by_income <- dt_working[
, c(
share_homeowners = mean(dummy_homeowner == 1, na.rm = TRUE)
),
by = .(ylabortt_group, age_group)
][order(ylabortt_group, age_group)]
print(result_by_income)
result_by_consum <- dt_working[
, c(
share_homeowners = mean(dummy_homeowner == 1, na.rm = TRUE)
),
by = .(consum_group, age_group)
][order(consum_group, age_group)]
print(result_by_consum)
gc()
rm(dt_homeowners)
dt_working_homeowners = dt_working[dummy_homeowner == 1]
dt_working_homeowners[ , dummy_mortgagor := as.integer(schulden != 0 & !is.na(schulden))]
dt_working_homeowners[, pc_ylabor := fifelse(
y_labor != 0 & !is.na(y_labor),
pc / y_labor,
NA_real_
)]
dt_working_homeowners[, ltv_ratio := fifelse(
agg_mv != 0 & !is.na(agg_mv),
schulden / agg_mv,
NA_real_
)]
dt_working_homeowners[, age_group := cut(age,
breaks = c(24, 35, 45, 55, 65),
labels = c("25-35", "36-45", "46-55", "56-65"),
right = TRUE
)]
dt_working_homeowners[, age_group := factor(age_group, levels = c("25-35", "36-45", "46-55", "56-65"))]
# Split sample at the median of labor income after taxes and transfers
ylabortt_median <- median(dt_working_homeowners$y_labor_tt, na.rm = TRUE)
dt_working_homeowners[, ylabortt_group := fifelse(
!is.na(y_labor_tt) & y_labor_tt <= ylabortt_median,
"Below/At Median",
fifelse(!is.na(y_labor_tt), "Above Median", NA_character_)
)]
# Split sample at the median of consumption
consum_median <- median(dt_working_homeowners$consum, na.rm = TRUE)
dt_working_homeowners[, consum_group := fifelse(
!is.na(consum) & consum <= consum_median,
"Below/At Median",
fifelse(!is.na(consum), "Above Median", NA_character_)
)]
vars_to_summarize <- c("pc_ylabor")
median_fn <- function(data, indices) median(data[indices], na.rm = TRUE)
boot_group_stats <- function(dt) {
dt[, .(
N = .N,
pc_ylabor_median = median(pc_ylabor, na.rm = TRUE),
# Bootstrap SE for median
pc_ylabor_median_se = boot(pc_ylabor, median_fn, R = 100)$t %>% sd(na.rm=TRUE),
# Mortgagor calculations/bootstraps
n_mortgagor = sum(dummy_mortgagor == 1, na.rm = TRUE),
median_ltv_mortgagor = median(ltv_ratio[dummy_mortgagor == 1], na.rm = TRUE),
# Bootstrap SE of median LTV (mortgagors only)
median_ltv_mortgagor_se = boot(ltv_ratio[dummy_mortgagor == 1], median_fn, R=100)$t %>% sd(na.rm=TRUE),
share_mortgagor = mean(dummy_mortgagor == 1, na.rm = TRUE)
), by = .(ylabortt_group, age_group)]
}
gc()
result_by_income <- boot_group_stats(dt_working_homeowners)[order(ylabortt_group, age_group)]
result_by_income
median_fn <- function(data, indices) median(data[indices], na.rm = TRUE)
# Function for grouped bootstrapping
boot_group_stats <- function(dt) {
dt[, .(
N = .N,
pc_ylabor_median = median(pc_ylabor, na.rm = TRUE),
# Bootstrap SE for median
pc_ylabor_median_se = boot(pc_ylabor, median_fn, R = 100)$t %>% sd(na.rm=TRUE),
# Mortgagor calculations/bootstraps
n_mortgagor = sum(dummy_mortgagor == 1, na.rm = TRUE),
median_ltv_mortgagor = median(ltv_ratio[dummy_mortgagor == 1], na.rm = TRUE),
# Bootstrap SE of median LTV (mortgagors only)
median_ltv_mortgagor_se = boot(ltv_ratio[dummy_mortgagor == 1], median_fn, R=100)$t %>% sd(na.rm=TRUE),
share_mortgagor = mean(dummy_mortgagor == 1, na.rm = TRUE)
), by = .(consum_group, age_group)]
}
result_by_consum <- boot_group_stats(dt_working_homeowners)[order(consum_group, age_group)]
result_by_consum
rm(dt_working)
rm(dt_working_homeowners)
rm(result_by_consum)
