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()

Funksjoner i R

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.

Produkfunksjoner

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

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).