Vi har brukt pakkene: tidyr, dplyr, ggplot2 og readr. Alle disse er faktisk relatert og har en felles design og teoretisk bakgrunn. Man kan laste ned alle disse pakkene samtidig med å skrive install.packages(“tidyverse”), og deretter laste inn pakkene ved å skrive:
library(tidyverse)
## ── Attaching packages ──────────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.1.0 ✔ purrr 0.2.5
## ✔ tibble 1.4.2 ✔ dplyr 0.7.6
## ✔ tidyr 0.8.2 ✔ stringr 1.3.1
## ✔ readr 1.3.1 ✔ forcats 0.3.0
## ── Conflicts ─────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
Vi har allerede brukt mange funksjoner i R. Innebygde funksjoner som plot() eller funksjoner i pakker som read_csv() eller ggplot(). I en funksjon, legger du inn input, og får ut output.
Ofte finnes det ikke en eksisterende funksjon som gjør akkurat det du vil gjøre. Men det er lett å lage din egen funksjon i R. Vi kan til og med bruke en funkjson til å simulere makroøkonomiske modeller, som en aggregert produktfunksjon.
Vi kan programmere inn en produktfunksjon i form av en Cobb-Doughlas modell:
BNP = function(A=1, a=.5, K, L){
Y = A*K^(a)*L^(1-a)
return(Y)
}
Her definerer vi en funksjon, som vi skal kalle BNP. Vi definerer også 4 input: A (total faktorproduktivitet), a vekting/innkeksts-andelene, K (kapital-beholdning) og L (arbeidskraft). Jeg har gitt default verdier til A og a. Det betyr at hvis man ikke spesifeserer noe annet, så blir disse automatisk satt til 1 og 0,5. Vi må selv sette inn verdiene for K og L.
I funksjonen blir innput funkjsonen brukt til å regne ut produksjon (BNP) ut i fra en Cobb-Douglas modell. Verdien av BNP blir satt i variablen Y, og Y funksjonen blir output fra funksjonen (return(Y)).
Hvis vi vil regne ut produksjon så kan vi kjøre funksjonen med innput: K=100, og L=100 (a og A blir satt til default-verdiene.)
prod = BNP(K=100, L=100)
print(prod)
## [1] 100
Vi kan leke med ulike inputs:
prod1 = BNP(K=50, L=100)
prod2 = BNP(K=25, L=100)
prod3 = BNP(a=.25, A=25, K=100, L=100)
print(c(prod1, prod2, prod3))
## [1] 70.71068 50.00000 2500.00000
Vi er ikke begrenset til enkel tall som innputts: vi kan sette inn en serie med tall, eller en vector.
Her skaper vi en serie fra 1 til 100, og kaller det for Ks og bruker det som innput i BNP. Output blir også i form av en serie eller vector. Vi kan deretter plotte forholdet mellom K og Y
Ks=1:100
Ys = BNP(A=10, a=.5, K=Ks, L=100)
plot(Ks, Ys, type="l")
Nå kan vi også variere a og se hvordan forholdet mellom produksjon og kapital endrer seg.
Ks=1:100
Ys1 = BNP(A=10, a=.1, K=Ks, L=100)
Ys2 = BNP(A=10, a=.3, K=Ks, L=100)
Ys3 = BNP(A=10, a=.5, K=Ks, L=100)
Ys4 = BNP(A=10, a=.7, K=Ks, L=100)
Ys5 = BNP(A=10, a=.9, K=Ks, L=100)
Nå har vi 5 ulike produksjons-serier, og vi kan organiserer de i en tibble.
produksjonFs = tibble(K=Ks, a.1=Ys1, a.3=Ys2, a.5=Ys3, a.7=Ys4, a.9=Ys5)
Vi vil bruke ggplot til å plotte alle seriene, så vi kan bruke gather til å sette det i lang-formatt.
prodF_long = gather(produksjonFs, key="a", value="Y", -K)
og da kan vi plotte alle seriene på samme plott.
ggplot(prodF_long, aes(x=K, y=Y, color=a)) +
geom_line()
Her kan vi se at a verdien påvirker hvor kurvet forholdet er mellom kapitalbeholdning og produksjon. Når a er mindre, så blir forholdet mer kurvet. Vi kan tolket det som at produksjon er mer avtakende til økt kapital.
Human Capital er ordet makroøkonomer bruker til å fortelle om hvor mye ulike land har investert i mennesker via læring, utdanning og utvikling. Penn World Tables (PWT) har en indikatør for human capital, hc. La oss se på sammenhengen mellom BNP-volum og human capital i 2014.
Vi laster inn pwt data-settet.
pwt = read_csv2("http://jmaurit.github.io/makro/labs/data/pwt90.csv")
## Using ',' as decimal and '.' as grouping mark. Use read_delim() for more control.
## Parsed with column specification:
## cols(
## .default = col_double(),
## countrycode = col_character(),
## country = col_character(),
## currency_unit = col_character(),
## i_cig = col_character(),
## i_xm = col_character(),
## i_xr = col_character(),
## i_outlier = col_character()
## )
## See spec(...) for full column specifications.
Vi filtrer ut data bare for året 2014.
bnp2014 = filter(pwt, year==2014)
Vi skaper variablen bnp per capita:
bnp2014["bnp_per_cap"] = bnp2014$rgdpe/bnp2014$pop
Nå kan vi bruke ggplot til å se på forholdet mellom BNP per capita og indikatøren for human capital:
ggplot(bnp2014, aes(x=hc, y=bnp_per_cap, label=country)) +
geom_point(alpha=.3) +
geom_text(size=2, nudge_x = 0.15) +
theme_light()
## Warning: Removed 38 rows containing missing values (geom_point).
## Warning: Removed 38 rows containing missing values (geom_text).
Hvis vi også vil se hvor stor disse økonomiene er i absolutt verdier, så kan variere størrelsene av punktene.
ggplot(bnp2014, aes(x=hc, y=bnp_per_cap, label=country)) +
geom_point(alpha=.3, aes(size=rgdpe)) +
geom_text(size=2, nudge_x = 0.15) +
theme_light()
## Warning: Removed 38 rows containing missing values (geom_point).
## Warning: Removed 38 rows containing missing values (geom_text).
Et problem, er at det er litt for mye tekst i vår plot.
bnp2014["country_lab"] = NA
labs= c("Norway", "United States", "Sweden", "China", "Singapore", "Angola")
bnp2014$country_lab[bnp2014$country %in% labs] = bnp2014$country[bnp2014$country %in% labs]
ggplot(bnp2014, aes(x=hc, y=bnp_per_cap, label=country_lab)) +
geom_point(alpha=.3, aes(size=rgdpe)) +
geom_text(size=3, nudge_x = 0.15) +
theme_light()
## Warning: Removed 38 rows containing missing values (geom_point).
## Warning: Removed 176 rows containing missing values (geom_text).