International økonomi
  • Software
    • Download R
    • Download RStudio
Handelsteori

Specifikke faktorer

Analyse med algebra og grafer
Specifikke faktorer
Udgivet

19. februar 2026

Kodelinks
R kode

I denne øvelse kobler vi algebraisk og grafisk analyse sammen, og bruger R til at udforske modellen med specifikke faktorer. Målet er at vise hvordan figurerne bygger på matematikken, og dermed give en dybere forståelse af modellen.

Ligesom i scenariet i kapitel 4, har vi to sektorer: tøjsektoren, der bruger arbejdskraft og kapital, og fødevaresektoren, der bruger arbejdskraft og jord. Arbejdskraften er mobil mellem sektorerne, mens kapital og jord er specifikke for hver sektor.

Da vi skal tegne figurer ud fra forskellige ligninger, får vi også brug for nogle værdier for de tre faktorer: mængden af arbejdskraft \(L\), mængden af kapital i tøjsektoren \(K\) og mængden af jord i fødevaresektoren \(T\). Vi kommer også til at bruge nogle parametre i produktionsfunktionerne, \(\alpha\) og \(\beta\). Derudover behøver vi priserne på de to varer, \(P_c\) og \(P_f\), for at kunne tegne ligevægten på arbejdsmarkedet senere.

library(tidyverse)

# Vi starter med at definere numeriske værdier for de variabler, vi skal bruge
v1 <- data.frame(
  L = 100,
  K = 50,
  T = 75,
  alpha = 0.5, # 0 < alpha < 1
  beta = 0.5, # 0 < beta < 1
  p_c = 1,
  p_f = 1
)
TipFrit valg!

Ved at definere værdierne i en data frame, kan vi nemt ændre dem og se hvordan det påvirker figurerne. Prøv at ændre på \(L\), \(K\), \(T\), \(\alpha\), \(\beta\), \(P_c\) og \(P_f\) og se hvordan det påvirker transformationskurven, arbejdsmarkedet og produktionen i ligevægten.

Transformationskurven

Vi har to sektorer, som producerer henholdsvis tøj og fødevarer. Lad os antage, at produktionen i hver sektor er givet ved Cobb–Douglas produktionsfunktioner:

\[ \begin{aligned} Q_c &= K^\alpha L_c^{(1-\alpha)}\\ Q_f &= T^\beta L_f^{(1-\beta)} \end{aligned} \]

Da vi har en fast mængde arbejdskraft, \(L\), kan vi udtrykke arbejdsfordelingen mellem de to sektorer som:

\[ \begin{aligned} L &= L_c + L_f \\ &= \left(\frac{Q_c}{K^\alpha}\right)^{\frac{1}{1-\alpha}} + \left(\frac{Q_f}{T^\beta}\right)^{\frac{1}{1-\beta}} \end{aligned} \]

Vi får den sidste linje ved at omskrive de to produktionsfunktioner til at isolere for \(L_c\) og \(L_f\).

For at tegne transformationskurven, kan vi løse for \(Q_f\) i forhold til \(Q_c\) ved at isolere \(L_f\) i den sidste ligning og indsætte det i produktionsfunktionen for tøj:

\[ \begin{aligned} L &= \left(\frac{Q_c}{K^\alpha}\right)^{\frac{1}{1-\alpha}} + \left(\frac{Q_f}{T^\beta}\right)^{\frac{1}{1-\beta}} \\ \left(\frac{Q_f}{T^\beta}\right)^{\frac{1}{1-\beta}} &= L - \left(\frac{Q_c}{K^\alpha}\right)^{\frac{1}{1-\alpha}} \\ Q_f &= T^\beta \left(L - \left(\frac{Q_c}{K^\alpha}\right)^{\frac{1}{1-\alpha}}\right)^{1-\beta} \end{aligned} \]

Denne ligning beskriver transformationskurven, som viser den maksimale mængde fødevarer (\(Q_f\)) der kan produceres for en given mængde tøj (\(Q_c\)), givet den faste mængde arbejdskraft og de specifikke faktorer i hver sektor.

Ved at antage numeriske værdier for \(L\), \(K\), \(T\), \(\alpha\), og \(\beta\), kan vi plotte denne kurve ved hjælp af ggplot2. Vi skal først definere en funktion, der beregner \(Q_f\) for en række værdier af \(Q_c\).

# Vi definerer en funktion, hvor man kan vælge værdier for 
# K, T, L, alpha og beta
ppf <- function(q = seq(0, max(L, K, T), by = 1), L = 100, K = 50, T = 50, alpha = 0.5, beta = 0.5) {
  q_x <- q
  q_y <- T^beta * (L - (q / K^alpha)^(1/(1-alpha)))^(1-beta)
  df <- data.frame(x = q_x, y = q_y)
  df <- dplyr::filter(df, y > 0 & !is.na(y))
  df <- dplyr::add_row(df, x = K^alpha * L^(1-alpha), y = 0)
  return(df)
}

# Nu bruger vi funktionen til at beregne punkter på transformationskurven 
# for specifikke værdier af K, T, L, alpha og beta
ppf_f <- ppf(L = v1$L, K = v1$K, T = v1$T, alpha = v1$alpha, beta = v1$beta)
# Værdierne for Q_c og Q_f bliver gemt i en data frame, 
# som vi kan bruge til at plotte kurven

plot_ppf <- ggplot(data = ppf_f, aes(x = x, y = y)) +
  geom_line(colour = blue) +
  labs(
    x = expression(paste("Mængde tøj, ", Q[c])),
    y = expression(paste("Mængde fødevarer, ", Q[f]))
    ) +
  theme_minimal()

For at inkludere matematiske notationer i ggplot2, kan man bruge funktionen expression() (fx i labs()).

AdvarselObs!

Ligesom i den tidligere dataøvelse, har jeg selv defineret farverne i mine plots: dvs. blue er en variabel. For at køre koden på sin egen computer kan man bare fjerne fx colour = blue eller ændre det til colour = "blue".

ForsigtigHvorfor definerer funktioner?

Man kunne sagtens have skrevet koden til at lave alle beregninger i en dataframe. Men ved at definere en funktion, kan man gentage øvelsen med forskellige værdier for \(L\), \(K\), \(T\), \(\alpha\) og \(\beta\) uden at skulle skrive koden om hver gang.

I funktionerne her har jeg også inkluderet nogle standardværdier for de forskellige variabler. Men man kan også definere funktioner uden standardværdier, fx:

testfn <- function(a, b, c) {
  return(a + b + c)
}

I så fald, når man kører testfn(), skal man altid angive værdier for alle argumenter.

testresult <- testfn(2, 3, 10)
Figur 1: Transformationskurven for tøj og fødevarer

Arbejdsmarkedet

Marginalproduktet af arbejdskraften i hver sektor er givet ved:

\[ \begin{aligned} \text{MPL}_c \equiv \frac{\partial Q_c}{\partial L_c} &= (1-\alpha) K^\alpha L_c^{-\alpha} \\ \text{MPL}_f \equiv \frac{\partial Q_f}{\partial L_f} &= (1-\beta) T^\beta L_f^{-\beta} \end{aligned} \]

Da arbejdskraften er mobil mellem sektorerne, vil den blive allokeret sådan, at lønnen i begge sektorer er den samme. Lønnen i hver sektor er lig med marginalproduktet af arbejdskraften i den pågældende sektor:

\[ \begin{aligned} w_c &= \text{MPL}_c P_c = P_c (1-\alpha) K^\alpha L_c^{-\alpha} \\ w_f &= \text{MPL}_f P_f = P_f (1-\beta) T^\beta L_f^{-\beta} \\ \therefore w &\equiv w_c = w_f \\ &= P_c (1-\alpha) K^\alpha L_c^{-\alpha} = P_f (1-\beta) T^\beta L_f^{-\beta} \end{aligned} \]

Vi kan plotte ligevægten på arbejdsmarkedet ved at tegne de to marginalprodukter som funktioner af \(L_c\) og \(L_f\), og finde det punkt hvor de krydser hinanden.

# Vi definerer en funktion, der beregner lønnen i hver sektor
labour <- function(L = 100, K = 50, T = 50, alpha = 0.5, beta = 0.5, p1 = 1, p2 = 1) {
  df <- data.frame(
    L1 = seq(1, L-1, by = 1),
    L2 = seq(L-1, 1, by = -1)
  )
  df$w1 = p1 * (1 - alpha) * K^alpha * df$L1^(-alpha)
  df$w2 = p2 * (1 - beta) * T^beta * df$L2^(-beta)
  return(df)
}

# Vi definerer en anden funktion til at beregne ligevægten på arbejdsmarkedet: 
# dvs. hvor w_c = w_f
equilibrium <- function(L = 100, K = 50, T = 50, alpha = 0.5, beta = 0.5, p1 = 1, p2 = 1) {
  objective <- function(L1) {
    w1 <- p1 * (1 - alpha) * K^alpha * L1^(-alpha)
    w2 <- p2 * (1 - beta) * T^beta * (L - L1)^(-beta)
    return((w1 - w2)^2)
  }
  
  result <- optimize(objective, interval = c(0.1, L - 0.1))
  L1_eq <- result$minimum
  L2_eq <- L - L1_eq
  w_eq <- p1 * (1 - alpha) * K^alpha * L1_eq^(-alpha)
  
  return(data.frame(L1 = L1_eq, L2 = L2_eq, w = w_eq))
}

# De to funktioner tager værdier for L, K, T, alpha og beta. 
# Den første giver en data frame med kolonner for L_c, L_f, w_c og w_f, som så 
# kan bruges til at plotte lønnen i hver sektor som funktion af arbejdsfordelingen. 
# Den anden returnerer værdierne for L_c, L_f og den fælles løn i ligevægten.
wages <- labour(L = v1$L, K = v1$K, T = v1$T, alpha = v1$alpha, beta = v1$beta, p1 = v1$p_c, p2 = v1$p_f)
eq <- equilibrium(L = v1$L, K = v1$K, T = v1$T, alpha = v1$alpha, beta = v1$beta, p1 = v1$p_c, p2 = v1$p_f)

plot_wage <- ggplot(data = wages, aes(x = L1, y = w1)) +
  geom_line(colour = orange) +
  geom_line(aes(y = w2), colour = cyan) +
  geom_vline(xintercept = eq$L1, linetype = "dashed", colour = grey) +
  geom_hline(yintercept = eq$w, linetype = "dashed", colour = grey) +
  geom_point(data = eq, aes(x = L1, y = w), colour = darkblue, size = 3) +
  annotate("label", x = eq$L1, y = 0, label = round(eq$L1, 2)) +
  annotate("label", x = 0, y = eq$w, label = round(eq$w, 2)) +
  labs(
    x = expression(paste("Mængde arbejdskraft i tøjsektoren, ", L[c])),
    y = "Løn"
  ) +
  theme_minimal()

Resultater

Andel af arbejdere i tøjsektoren

40%

Andel af arbejdere i fødevaresektoren

60%

Ligevægtsløn (begge sektorer)

0.56

Figur 2: Arbejdsmarkedet for tøj og fødevarer

På denne side viser jeg interaktive udgaver af de plots man laver i ggplot2. Da man har mulighed for at tilføje hover-tekst, bruger jeg ikke de samme annotationer som jeg definerer i koden ovenfor.

Output

Nu hvor vi har fundet ligevægten på arbejdsmarkedet, kan vi beregne den tilsvarende produktion af tøj og fødevarer ved at indsætte værdierne for \(L_c\) og \(L_f\) i produktionsfunktionerne. Vi kan også tilføje budgetlinjen (isoværdien), som afspejler den relative pris på de to varer.

# Produktionsfuktionerne givet ligevægten på arbejdsmarkedet
Qc <- v1$K^v1$alpha * eq$L1^(1-v1$alpha)
Qf <- v1$T^v1$beta * eq$L2^(1-v1$beta)

# Isoværdien givet priserne på de to varer
iso_yint = Qf + (v1$p_c/v1$p_f) * Qc
iso_xint = (v1$p_f/v1$p_c) * iso_yint

iso = data.frame(
  x = c(0, iso_xint),
  y = c(iso_yint, 0)
)

# Plot produktionen i ligevægten på samme graf som transformationskurven
plot_prod <- plot_ppf + 
  geom_line(data = iso, aes(x=x, y=y), colour = violet) +
  geom_vline(xintercept = Qc, linetype = "dashed", colour = grey) +
  geom_hline(yintercept = Qf, linetype = "dashed", colour = grey) +
  annotate("point", x = Qc, y = Qf, colour = darkblue, size = 3) + 
  annotate("label", x = Qc, y = 0, label = round(Qc, 0)) +
  annotate("label", x = 0, y = Qf, label = round(Qf, 0))

Resultater

Mængde tøj produceret i ligevægt

44.72

Mængde fødevarer produceret i ligevægt

67.08

Figur 3: Transformationskurven og produktionen
ForsigtigHvor kommer priserne fra?

Indtil videre har vi kun antaget værdier for priserne på de to varer, \(P_c\) og \(P_f\). Men pris hænger sammen med det relative udbud og efterspørgsel på de to varer, som igen afhænger af produktionen i hver sektor.

I de kommende uger kommer vi derfor til at udvide modellen, så den også inkluderer efterspørgsel og handel, og dermed kan vi beregne priserne endogent i modellen. Det vil give os mulighed for at tegne ligevægten i både den lukkede og den åbne økonomi, og se hvordan handel påvirker produktionen og velfærden i de to sektorer.

Ændringer

Hvad nu hvis priserne ændrer sig? Antag nu at prisen på tøj stiger. Hvordan påvirker det ligevægten på arbejdsmarkedet og produktionen i de to sektorer?

Ved at bruge de samme funktioner vi definerede tidligere, kan vi nemt beregne den nye ligevægt og plotte den sammen med den gamle for at se forskellen.

v2 <- data.frame(
  L = 100,
  K = 50,
  T = 75,
  alpha = 0.5, 
  beta = 0.5, 
  p_c = 2, # <-- prisen på tøj stiger
  p_f = 1
)

wages2 <- labour(L = v2$L, K = v2$K, T = v2$T, alpha = v2$alpha, beta = v2$beta, p1 = v2$p_c, p2 = v2$p_f)
eq2 <- equilibrium(L = v2$L, K = v2$K, T = v2$T, alpha = v2$alpha, beta = v2$beta, p1 = v2$p_c, p2 = v2$p_f)

plot_wage2 <- ggplot(data = wages, aes(x = L1, y = w1)) +
  geom_line(colour = orange, alpha = 0.75, linetype = "longdash") +
  geom_line(aes(y = w2), colour = cyan, alpha = 0.75, linetype = "longdash") +
  geom_line(data = wages2, colour = orange) +
  geom_line(data = wages2, aes(y = w2), colour = cyan) +
  geom_point(data = eq, aes(x = L1, y = w), colour = darkblue, shape = 1, size = 3) +
  geom_point(data = eq2, aes(x = L1, y = w), colour = darkblue, size = 3) +
  geom_vline(xintercept = eq2$L1, linetype = "dashed", colour = grey) +
  geom_hline(yintercept = eq2$w, linetype = "dashed", colour = grey) +
  annotate("label", x = eq2$L1, y = 0, label = round(eq2$L1, 2)) +
  annotate("label", x = 0, y = eq2$w, label = round(eq2$w, 2)) +
  labs(
    x = expression(paste("Mængde arbejdskraft i tøjsektoren, ", L[c])),
    y = "Løn"
  ) +
  theme_minimal()

Qc2 <- v2$K^v2$alpha * eq2$L1^(1-v2$alpha)
Qf2 <- v2$T^v2$beta * eq2$L2^(1-v2$beta)

iso_yint2 = Qf2 + (v2$p_c/v2$p_f) * Qc2
iso_xint2 = (v2$p_f/v2$p_c) * iso_yint2

iso2 = data.frame(
  x = c(0, iso_xint2),
  y = c(iso_yint2, 0)
)

ppf_f2 <- ppf(L = v2$L, K = v2$K, T = v2$T, alpha = v2$alpha, beta = v2$beta)

plot_prod2 <- ggplot(data = ppf_f2, aes(x = x, y = y)) +
  geom_line(data = ppf_f, aes(x = x, y = y), colour = blue, alpha = 0.75, linetype = "longdash") +  
  geom_line(colour = blue) +  
  geom_line(data = iso, aes(x=x, y=y), colour = violet, alpha = 0.75, linetype = "longdash") +
  geom_line(data = iso2, aes(x=x, y=y), colour = violet) +
  geom_vline(xintercept = Qc2, linetype = "dashed", colour = grey) +
  geom_hline(yintercept = Qf2, linetype = "dashed", colour = grey) +
  annotate("point", x = Qc, y = Qf, colour = darkblue, size = 3, shape = 1) + 
  annotate("point", x = Qc2, y = Qf2, colour = darkblue, size = 3)+ 
  annotate("label", x = Qc2, y = 0, label = round(Qc2, 0)) +
  annotate("label", x = 0, y = Qf2, label = round(Qf2, 0)) +
    theme_minimal() +
  labs(x = expression(paste("Mængde tøj, ", Q[c])), y = expression(paste("Mængde fødevarer, ", Q[f]))) +
  theme(plot.title = element_text(hjust = 0.5))

Man kunne også bruge koden her til at sammenligne to lande, som i autarki har forskellige relative priser på de to varer.

  • Arbejdsmarkedet
  • Produktionen

Konsekvensen af en stigning i prisen på tøj er, at 33 arbejdere flytter til tøjsektoren fra fødevaresektoren. Lønnen stiger samtidigt med 0.27. Produktionen af tøj stiger med 15.58, mens produktionen af fødevarer falder med 21.86.

Læs mere

Denne øvelse er inspireret af Jonathan Connings undervisningsmateriale. Den store forskel er programmeringssproget: hvor vi bruger R, bruger han Python.

Man kan også installere pakken econocharts, som indeholder en række funktioner til at tegne økonomiske diagrammer i ggplot2, herunder transformationskurver (som vi ellers har kodet selv ovenfor).

NF SDU

Nick Ford
Syddansk Universitet
Økonomisk Institut

© 2026 Nick Ford.