misc-research/Financial-Marginalization-and-Cryptocurrency/Financial-Marginalization-and-Cryptocurrency-Payments.Rmd

690 lines
19 KiB
Text

---
title: "Financial Marginalization and Cryptocurrency Payments"
author: "Rucknium"
date: '2022-05-26'
output: html_document
---
```{css, echo=FALSE}
body .main-container {
max-width: 1480px !important;
width: 1480px !important;
}
body {
max-width: 1480px !important;
}
```
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, size = "small", tidy = FALSE)
options(width = 170)
# or_glm function adapted from "oddsratio" package so it can
# handle svyglm functions:
or_svyglm <- function (data, model, incr, ci = 0.95)
{
if (any(class(model) %in% "glm")) {
preds <- names(coefficients(model))[2:length(coefficients(model))]
coef <- coefficients(model)[2:length(coefficients(model))]
}
increments <- list()
odds_ratios <- list()
ci_low <- list()
ci_high <- list()
for (i in preds) {
if (any(class(model) %in% "glm")) {
ci_list <- data.frame(suppressMessages(confint(model,
level = ci)))[-1, ]
}
if (is.numeric(data[[i]]) | is.integer(data[[i]])) {
odds_ratios[[i]] <- round(exp(as.numeric(coef[[i]]) *
as.numeric(incr[[i]])), 3)
if (!class(model)[1] == "glmmPQL") {
ci_low[[i]] <- round(exp(ci_list[i, 1] * as.numeric(incr[[i]])),
3)
ci_high[[i]] <- round(exp(ci_list[i, 2] * as.numeric(incr[[i]])),
3)
}
increments[[i]] <- as.numeric(incr[[i]])
or <- odds_ratios[[i]]
}
else {
odds_ratios[[i]] <- round(exp(as.numeric(coef[[i]])),
3)
if (!class(model)[1] == "glmmPQL") {
ci_low[[i]] <- round(exp(ci_list[i, 1]), 3)
ci_high[[i]] <- round(exp(ci_list[i, 2]), 3)
}
increments[[i]] <- "Indicator variable"
or <- odds_ratios[[i]]
}
}
result <- data.frame(predictor = names(odds_ratios), oddsratio = unlist(odds_ratios,
use.names = FALSE), ci_low = unlist(ci_low, use.names = FALSE),
ci_high = unlist(ci_high, use.names = FALSE), increment = unlist(increments,
use.names = FALSE))
if (any(class(model) %in% "glm")) {
col_names <- gsub("\\.\\.", replacement = "", names(ci_list))
col_names <- gsub("X", replacement = "", col_names)
colnames(result)[3] <- paste0("ci_low (", col_names[1],
")")
colnames(result)[4] <- paste0("ci_high (", col_names[2],
")")
}
return(result)
}
```
## Load packages
```{r load-packages}
# install.packages("readstata13")
# install.packages("survey")
# install.packages("corrplot")
library(readstata13)
library(survey)
library(corrplot)
```
## Download and import data
```{r get-data}
# download.file("https://www.federalreserve.gov/consumerscommunities/files/SHED_public_use_data_2021_(Stata).zip",
# "data/SHED_public_use_data_2021_(Stata).zip")
# unzip("data/SHED_public_use_data_2021_(Stata).zip", exdir = "data")
SHED <- readstata13::read.dta13("data/public2021.dta", generate.factors = TRUE, nonint.factors = TRUE)
# S16_b
# In the past year, have you done the following
# with cryptocurrency, such as Bitcoin or Ethereum?
# - Used to buy something or make a payment
SHED$crypto.used.as.payment <- SHED$S16_b == "Yes"
# BK1
# Do you and/or your spouse or partner
# currently have a checking, savings or money
# market account?
SHED$lacks.bank.account <- SHED$BK1 == "No"
# C2A
# Do you currently have at least one credit card?
SHED$lacks.credit.card <- SHED$C2A == "No"
# ppgender
# Gender [Ipsos source]
SHED$is.male <- SHED$ppgender == "Male"
# race_5cat Race 5 categories
SHED$race <- SHED$race_5cat
# ED0
# What is the highest level of school you have
# completed or the highest degree you have
# received?
SHED$education.level <- relevel(SHED$ED0, "High school degree or GED")
# ED1
# Which one of the following broad categories
# best describes your (current/most recent)
# educational program?
SHED$education.subject <- relevel(SHED$ED1, "Business/management")
# pppa_lgb [Ipsos source]
# Q230: Which of the following best describes how you think of yourself?
SHED$lgbtq <- relevel(SHED$pppa_lgb, "Straight, that is, not gay")
# ppp20197 [Ipsos source]
# QEG22: Are you a citizen of the United States?
SHED$is.noncitizen <- SHED$ppp20197 == "No"
# I40
# Which of the following categories best
# describes the total income that you and/or
# your spouse or partner received from all
# sources, before taxes and deductions, in the
# past 12 months?
SHED$income.category <- SHED$I40
# B2
# Overall, which one of the following best
# describes how well you are managing
# financially these days?
SHED$overall.financial.wellbeing <- SHED$B2
# I41_b
# Supplemental Nutrition Assistance Program
# (SNAP or food stamps) - In the past 12
# months, have you received any of the
# following?
SHED$received.food.stamps <- SHED$I41_b
# FL0
# On a scale from zero to ten, where zero is
# not at all willing to take risks and ten is
# very willing to take risks, what number would
# you be on the scale?
SHED$risk.tolerance <- as.numeric(SHED$FL0) - 1
# B10
# Overall, on a scale from zero to ten, where
# zero is not at all satisfied and ten is
# completely satisfied, how satisfied are you
# with life as a whole these days?
SHED$life.satisfaction <- as.numeric(SHED$B10) - 1
# ppage
# Age [Ipsos source]
# ppcmdate
# Date member completed Core survey
# Must correct age variable for time of initial Ipsos survey
SHED$age <- SHED$ppage + (2021 - as.numeric(substr(SHED$ppcmdate, 1, 4)))
# ind1
# IND1: Industry (tight scale) in current or main job
SHED$job.industry <- relevel(SHED$ind1, "Retail/Stores/Shopping (including Online Retail)")
# ppcm0160 [Ipsos source]
# Q26: Occupation (detailed) in current or main job
SHED$job.occupation <- relevel(SHED$ppcm0160, "Retail Sales")
# ppcm1301 [Ipsos source]
# GOVEMP1: Employer type
SHED$employer.type <- relevel(SHED$ppcm1301, "Private-for-profit company")
# ppmsacat
# MSA Status [Ipsos source]
SHED$resides.in.metro.statistical.area <- SHED$ppmsacat == "Metro"
# ppfs0596 [Ipsos source]
# Q22: What is the approximate total amount of
# your household's savings and investments?
SHED$total.household.savings <- relevel(SHED$ppfs0596, "$100,000 - $249,999")
# A1_a
# In the past 12 months, has each of the following happened to you:
# - Turned down for credit
SHED$rejected.for.credit <- SHED$A1_a == "Yes"
# BK2_a
# In the past 12 months, did you and/or spouse or partner:
# - Purchase a money order from a place other than a bank
SHED$purchase.non.bank.money.order <- SHED$BK2_a == "Yes"
# BK2_b
# In the past 12 months, did you and/or spouse or partner:
# - Cash a check at a place other than a bank
SHED$cash.check.non.bank <- SHED$BK2_b == "Yes"
# BK2_c
# In the past 12 months, did you and/or spouse or partner:
# - Take out a payday loan or payday advance
SHED$take.payday.loan <- SHED$BK2_c == "Yes"
# BK2_d
# In the past 12 months, did you and/or spouse or partner:
# - Take out a pawn shop loan or an auto title loan
SHED$take.auto.or.pawn.shop.loan <- SHED$BK2_d == "Yes"
# BK2_e
# In the past 12 months, did you and/or spouse or partner:
# - Obtain a tax refund advance to receive your refund faster
SHED$take.tax.refund.advance <- SHED$BK2_e == "Yes"
# BNPL1
# In the past year, have you used a “Buy Now
# Pay Later” service to buy something?
SHED$used.buy.now.pay.later <- SHED$BNPL1 == "Yes"
# ppfs1482 [Ipsos source]
# Q108: Where do you think your credit score falls
SHED$perceived.credit.score <- relevel(SHED$ppfs1482, "Fair")
# GE2A
# Some people earn money by selling items at
# places like flea markets and garage sales or
# through online marketplaces like eBay or
# Etsy. In the past month, have you made money
# by selling items in any of these ways?
SHED$informal.selling.of.goods <- SHED$GE2A == "Yes"
# GE1A
# In the past month, have you done any
# freelance or gig-work, either to supplement
# your income or as your main job?
SHED$freelance.or.gig.work <- SHED$GE1A == "Yes"
# E7
# During the past 12 months, have you
# personally experienced discrimination or
# unfair treatment because of your race,
# ethnicity, age, religion, disability status,
# sexual orientation, gender, or gender
# identity?
SHED$experienced.discrimination <- SHED$E7 == "Yes"
# E8_b
# In the past 12 months, did you personally experience
# discrimination or unfair treatment while
# doing any of the following?
# - Banking or applying for a loan
SHED$experienced.discrimination.in.banking <- SHED$E8_b %in% "Yes"
# xlaptop
# Is R a KP laptop user?
SHED$is.kp.laptop.user <- SHED$xlaptop %in% "Yes"
# devicetype2
# DOV: Device Type - at the end of survey
SHED$respondent.device.type <- relevel(SHED$devicetype2, "WinPC")
SHED <- svydesign(ids = ~0, data = SHED, weights = SHED$weight_pop)
# weight_pop used as survey weights, in accordance with suggestion by:
# https://www.federalreserve.gov/consumerscommunities/files/SHED_2021codebook.pdf
```
## Checking correlations between main variables
```{r initial-correlations}
svyvar.covariance <- svyvar(~ age + is.male + crypto.used.as.payment +
lacks.bank.account + lacks.credit.card, SHED, na.rm = TRUE)
attr(svyvar.covariance, "var") <- NULL
svyvar.correlation <- cov2cor(as.matrix(svyvar.covariance))
print(round(svyvar.correlation, 3))
corrplot(svyvar.correlation, tl.col = "darkred", tl.srt = 35,
method = "shade", number.digits = 2, addshade = "all", diag = FALSE,
title = "\n\n Correlation Matrix of Financial Marginalization\nand Use of Cryptocurrency as a Means of Payment",
addCoef.col = "black", type = "lower")
```
# Main results
## lacks.bank.account
```{r main-results-lacks-bank-account}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + lacks.bank.account,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## lacks.credit.card
```{r main-results-lacks-credit-card}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + lacks.credit.card,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
# Additional results on financial marginalization
## rejected.for.credit
```{r other-financial-marginalization-rejected-for-credit}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + rejected.for.credit,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## purchase.non.bank.money.order
```{r other-financial-marginalization-purchase-non-bank-money-order}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + purchase.non.bank.money.order,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## cash.check.non.bank
```{r other-financial-marginalization-cash-check-non-bank}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + cash.check.non.bank,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## take.payday.loan
```{r other-financial-marginalization-take-payday-loan}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + take.payday.loan,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## take.auto.or.pawn.shop.loan
```{r other-financial-marginalization-take-auto-or-pawn-shop-loan}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + take.auto.or.pawn.shop.loan,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## take.tax.refund.advance
```{r other-financial-marginalization-take-tax-refund-advance}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + take.tax.refund.advance,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## used.buy.now.pay.later
```{r other-financial-marginalization-used-buy-now-pay-later}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + used.buy.now.pay.later,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## experienced.discrimination.in.banking
```{r other-financial-marginalization-experienced-discrimination-in-banking}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + experienced.discrimination.in.banking,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## perceived.credit.score
```{r other-financial-marginalization-perceived-credit-score}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + perceived.credit.score,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
# General societal marginalization
## experienced.discrimination
```{r general-societal-marginalization-experienced-discrimination}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + experienced.discrimination,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## race
```{r general-societal-marginalization-race}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + race,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## is.noncitizen
```{r general-societal-marginalization-is.noncitizen}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + is.noncitizen,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## lgbtq
```{r general-societal-marginalization-lgbtq}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + lgbtq,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
# Data quality sanity checks
## education.subject
```{r data-quality-checks-education-subject}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + education.subject,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## job.industry
```{r data-quality-checks-job-industry}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + job.industry,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## job.occupation
```{r data-quality-checks-job-occupation}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + job.occupation,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## risk.tolerance
```{r data-quality-checks-risk-tolerance}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + risk.tolerance,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1, risk.tolerance = 1))
```
# Miscellaneous
## education.level
```{r miscellaneous-education-level}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + education.level,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## income.category
```{r miscellaneous-income-category}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + income.category,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## total.household.savings
```{r miscellaneous-total-household-savings}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + total.household.savings,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## overall.financial.wellbeing
```{r miscellaneous-overall-financial-wellbeing}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + overall.financial.wellbeing,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## received.food.stamps
```{r miscellaneous-received-food-stamps}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + received.food.stamps,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## life.satisfaction
```{r miscellaneous-life-satisfaction}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + life.satisfaction,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1, life.satisfaction = 1))
```
## employer.type
```{r miscellaneous-employer-type}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + employer.type,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## employer.type = Self-employed & job.occupation = Computer and Mathematical
```{r miscellaneous-self-employed-computer-industry}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male +
I(employer.type == "Self-employed") * I(job.occupation == "Computer and Mathematical"),
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
print(or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1)))
```
## informal.selling.of.goods
```{r miscellaneous-informal-selling-of-goods}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + informal.selling.of.goods,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## freelance.or.gig.work
```{r miscellaneous-freelance-or-gig-work}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + freelance.or.gig.work,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## resides.in.metro.statistical.area
```{r miscellaneous-resides-in-metro-statistical-area}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + resides.in.metro.statistical.area,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## respondent.device.type
```{r miscellaneous-respondent-device-type}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + respondent.device.type,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```
## is.kp.laptop.user
```{r miscellaneous-is-kp-laptop-user}
svyglm.fit <- svyglm(crypto.used.as.payment ~ age + is.male + is.kp.laptop.user,
SHED, family = stats::quasibinomial(link = "logit"))
summary(svyglm.fit)
or_svyglm(SHED$variables, svyglm.fit, incr = list(age = 1))
```