1. Библиотеки
library(dplyr) # работа с данными
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2) # для построения графиков
library(modelsummary) # для вывода красивых таблиц
library(flextable) # для вывода красивых таблиц
library(corrplot) # матрица корреляций
## corrplot 0.95 loaded
library(tseries) # тест на стационарность
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(strucchange) # тест на наличие разрыва
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: sandwich
library(lmtest) # диагностика регрессий: автокорреляция, гетероскедастичность, RESET
library(car) # диагностика мультиколлинеарности
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
  1. Загрузка данных и преобразование для TFP
# Загружаем данные
data_CHN <- read.csv("CHN.csv")
data_DEU <- read.csv("DEU.csv")

# Логарифм TFP
data_CHN$ln_tfp <- log(data_CHN$tfp)
data_DEU$ln_tfp <- log(data_DEU$tfp)
  1. Описательный анализ
# Графики TFP и FDI
data_CHN$country <- "China"
data_DEU$country <- "Germany"

data <- rbind(data_CHN, data_DEU)

# TFP
ggplot(data, aes(x = year, y = tfp, color = country)) +
  geom_line(linewidth = 1) +
  geom_point(size = 2) +
  labs(title = "TFP Dynamics: China and Germany", x = "Year", y = "TFP", color = "Country") +
  theme_minimal()

# FDI
ggplot(data, aes(x = year, y = fdi, color = country)) +
  geom_line(linewidth = 1) +
  geom_point(size = 2) +
  labs(title = "FDI Dynamics: China and Germany", x = "Year", y = "FDI (% of GDP)", color = "Country") +
  theme_minimal()

Китай демонстрирует устойчивый рост производительности на протяжении всего периода и к 2021-2023 гг. достигает уровня Германии. В Германии TFP остается относительно стабильным, колеблясь около единицы. В Китае наблюдается общий нисходящий тренд притока FDI относительно ВВП. Особенно выделяется высокий уровень FDI в Германии в 2000 г., после чего значения существенно снижаются и колеблются в более узком диапазоне. Рост TFP не сопровождается одинаковой динамикой FDI в двух странах.

# Описательные статистики
data$country <- factor(data$country, levels = c("China", "Germany"))
fmt_e <- fmt_decimal(2)

tab_desc <- datasummary(
  (`Total factor productivity` = tfp) +
  (`FDI, net inflows (% of GDP)` = fdi) +
  (`Gross capital formation (% of GDP)` = gcf) +
  (`Human capital index` = hc) +
  (`Trade (% of GDP)` = trade) +
  (`R&D expenditure (% of GDP)` = rd) +
  (`Manufacturing value added (% of GDP)` = manuf) ~
    country * (N + Mean + SD + Median + Min + Max),
  data = data,
  fmt = fmt_e,
  output = "flextable")

tab_desc %>% vline(j = 7, border = fp_border_default(width = 2), part = "all") %>% fontsize(size = 9, part = "all") %>% autofit()

China

Germany

N

Mean

SD

Median

Min

Max

N

Mean

SD

Median

Min

Max

Total factor productivity

24

0.77

0.16

0.79

0.51

1.01

24

0.96

0.03

0.96

0.92

1.00

FDI, net inflows (% of GDP)

24

2.73

1.19

2.88

0.28

4.49

24

2.55

2.39

2.03

-0.72

12.61

Gross capital formation (% of GDP)

24

41.87

3.33

42.45

33.63

46.27

24

20.69

1.51

20.42

18.01

23.96

Human capital index

24

2.52

0.15

2.49

2.31

2.75

24

3.64

0.04

3.66

3.57

3.71

Trade (% of GDP)

24

45.13

9.40

43.13

34.34

63.57

24

73.12

8.32

76.06

58.33

88.79

R&D expenditure (% of GDP)

24

1.74

0.51

1.82

0.88

2.58

24

2.74

0.28

2.77

2.38

3.15

Manufacturing value added (% of GDP)

20

29.18

2.46

29.98

25.01

31.99

24

19.60

0.77

19.78

17.34

20.53

Средний уровень TFP выше в Германии (0.96 против 0.77), как и показатели человеческого капитала, открытости торговли и расходов на R&D. Китай, напротив, характеризуется значительно более высокой долей валового накопления капитала и обрабатывающей промышленности в ВВП. Средний уровень FDI в странах близок, однако в Германии он существенно более волатилен. Для Manufacturing в Китае доступно только 20 наблюдений, поэтому эта переменная используется как дополнительная в моделях для Германии.

# Матрица корреляций
vars <- c("tfp", "fdi", "gcf", "hc", "trade", "rd", "manuf")
# Цветовая палитра
col_corr <- colorRampPalette(c("white", "#e3f0ff", "#a9cffa", "#4a90e2"))(200)

corr_CHN <- cor(data_CHN[, vars], use = "pairwise.complete.obs")
corrplot(
  corr_CHN,
  method = "color",
  type = "upper",
  col = col_corr,
  tl.col = "black",
  tl.srt = 45,
  addCoef.col = "black",
  number.cex = 0.7,
  title = "Correlation Matrix: China",
  mar = c(0, 0, 2, 0))

corr_DEU <- cor(data_DEU[, vars], use = "pairwise.complete.obs")
corrplot(
  corr_DEU,
  method = "color",
  type = "upper",
  col = col_corr,
  tl.col = "black",
  tl.srt = 45,
  addCoef.col = "black",
  number.cex = 0.7,
  title = "Correlation Matrix: Germany",
  mar = c(0, 0, 2, 0))

В Китае TFP сильно положительно связан с HC и R&D и отрицательно — с FDI и Manufacturing. При этом между HC, R&D и Manufacturing наблюдается очень высокая корреляция, из-за чего может возникнуть проблема мультиколлинеарности. В Германии TFP наиболее тесно связан с HC, Trade и R&D, тогда как корреляция с FDI слабая. Между HC, Trade и R&D также наблюдается высокая взаимосвязь, поэтому модели с HC и R&D оцениваются отдельно.

  1. Базовые модели в уровнях
# m1: ln_tfp ~ fdi + gcf + rd + trade
# m2: ln_tfp ~ fdi + gcf + hc + trade
# Включаем один из факторов rd/hc, так как они сильно коррелируют между собой - возникнет проблема мультиколлинеарности
m1_CHN <- lm(ln_tfp ~ fdi + gcf + rd + trade, data = data_CHN)
m2_CHN <- lm(ln_tfp ~ fdi + gcf + hc + trade, data = data_CHN)

m1_DEU <- lm(ln_tfp ~ fdi + gcf + rd + trade, data = data_DEU)
m2_DEU <- lm(ln_tfp ~ fdi + gcf + hc + trade, data = data_DEU)

summary(m1_CHN)
## 
## Call:
## lm(formula = ln_tfp ~ fdi + gcf + rd + trade, data = data_CHN)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.057653 -0.029172 -0.003818  0.015609  0.096952 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -1.2456007  0.1247146  -9.988 5.37e-09 ***
## fdi          0.0043217  0.0227866   0.190    0.852    
## gcf          0.0060762  0.0043542   1.395    0.179    
## rd           0.4069239  0.0494615   8.227 1.10e-07 ***
## trade       -0.0001516  0.0018251  -0.083    0.935    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.04317 on 19 degrees of freedom
## Multiple R-squared:  0.9686, Adjusted R-squared:  0.962 
## F-statistic: 146.4 on 4 and 19 DF,  p-value: 5.397e-14
summary(m2_CHN)
## 
## Call:
## lm(formula = ln_tfp ~ fdi + gcf + hc + trade, data = data_CHN)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.085728 -0.015634 -0.000399  0.016749  0.090271 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -4.2344855  0.3962392 -10.687 1.79e-09 ***
## fdi          0.0026466  0.0238844   0.111    0.913    
## gcf          0.0187309  0.0035852   5.225 4.83e-05 ***
## hc           1.2521282  0.1615492   7.751 2.67e-07 ***
## trade        0.0001377  0.0019062   0.072    0.943    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.0452 on 19 degrees of freedom
## Multiple R-squared:  0.9656, Adjusted R-squared:  0.9583 
## F-statistic: 133.2 on 4 and 19 DF,  p-value: 1.289e-13
summary(m1_DEU)
## 
## Call:
## lm(formula = ln_tfp ~ fdi + gcf + rd + trade, data = data_DEU)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.024847 -0.005887  0.001669  0.006614  0.019376 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.3572790  0.0403099  -8.863 3.54e-08 ***
## fdi         -0.0017894  0.0014574  -1.228  0.23450    
## gcf          0.0055798  0.0022408   2.490  0.02220 *  
## rd           0.0458239  0.0148447   3.087  0.00607 ** 
## trade        0.0011545  0.0005292   2.182  0.04190 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.01177 on 19 degrees of freedom
## Multiple R-squared:  0.8453, Adjusted R-squared:  0.8127 
## F-statistic: 25.95 on 4 and 19 DF,  p-value: 1.806e-07
summary(m2_DEU)
## 
## Call:
## lm(formula = ln_tfp ~ fdi + gcf + hc + trade, data = data_DEU)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.025375 -0.006250  0.001700  0.007077  0.022835 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)  
## (Intercept) -1.5538749  0.5812119  -2.674   0.0150 *
## fdi         -0.0013979  0.0016008  -0.873   0.3934  
## gcf          0.0070347  0.0024888   2.827   0.0108 *
## hc           0.3613424  0.1721142   2.099   0.0494 *
## trade        0.0008002  0.0008470   0.945   0.3566  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.01299 on 19 degrees of freedom
## Multiple R-squared:  0.8114, Adjusted R-squared:  0.7717 
## F-statistic: 20.44 on 4 and 19 DF,  p-value: 1.141e-06

В моделях в уровнях влияние FDI на TFP не обнаружено ни в Китае, ни в Германии. В Китае основными значимыми факторами являются R&D, HC и GCF, а в Германии — GCF, R&D, Trade и HC. При этом из-за нестационарности рядов (проверка будет далее) эти результаты рассматриваются как предварительные.

# m1_manuf: m1 + manuf
# m2_manuf: m2 + manuf
# Для DEU добавим переменную manuf, для CHN этого не делаем, так как она сильно коррелирует с другими Х, поэтому может возникнуть проблема мультиколлинеарности
m1_manuf_DEU <- lm(ln_tfp ~ fdi + gcf + rd + trade + manuf, data = data_DEU)
m2_manuf_DEU <- lm(ln_tfp ~ fdi + gcf + hc + trade + manuf, data = data_DEU)

summary(m1_manuf_DEU)
## 
## Call:
## lm(formula = ln_tfp ~ fdi + gcf + rd + trade + manuf, data = data_DEU)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.016093 -0.005672  0.001185  0.005557  0.012894 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.5820304  0.0750723  -7.753 3.82e-07 ***
## fdi         -0.0025162  0.0011988  -2.099  0.05019 .  
## gcf          0.0057617  0.0018131   3.178  0.00521 ** 
## rd           0.0707801  0.0141609   4.998 9.32e-05 ***
## trade        0.0005339  0.0004670   1.143  0.26783    
## manuf        0.0101970  0.0030681   3.324  0.00378 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.009518 on 18 degrees of freedom
## Multiple R-squared:  0.9041, Adjusted R-squared:  0.8775 
## F-statistic: 33.94 on 5 and 18 DF,  p-value: 1.477e-08
summary(m2_manuf_DEU)
## 
## Call:
## lm(formula = ln_tfp ~ fdi + gcf + hc + trade + manuf, data = data_DEU)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.020152 -0.006288  0.001650  0.007265  0.014323 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -3.0586636  0.6905727  -4.429 0.000324 ***
## fdi         -0.0020237  0.0013499  -1.499 0.151152    
## gcf          0.0084756  0.0021272   3.984 0.000870 ***
## hc           0.7342789  0.1882996   3.900 0.001051 ** 
## trade       -0.0007776  0.0008744  -0.889 0.385601    
## manuf        0.0118775  0.0038846   3.058 0.006779 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.01083 on 18 degrees of freedom
## Multiple R-squared:  0.8759, Adjusted R-squared:  0.8414 
## F-statistic:  25.4 on 5 and 18 DF,  p-value: 1.444e-07

В расширенных моделях для Германии с Manufacturing появляются первые признаки связи FDI с TFP: в спецификации с R&D коэффициент FDI отрицательный и значимый на 5% уровне, тогда как в модели с HC он остается незначимым. При этом GCF и Manufacturing положительно значимы в обеих моделях, а R&D и HC - в соответствующих спецификациях.

  1. Проверка стационарности
# CHN
# ADF-тест
# H0: ряд имеет единичный корень, то есть нестационарен
# H1: ряд стационарен
# ADF p < 0.05 -> отвергаем H0, есть признаки стационарности
adf.test(data_CHN$ln_tfp)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_CHN$ln_tfp
## Dickey-Fuller = -1.3794, Lag order = 2, p-value = 0.8088
## alternative hypothesis: stationary
adf.test(data_CHN$fdi)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_CHN$fdi
## Dickey-Fuller = -2.2696, Lag order = 2, p-value = 0.4697
## alternative hypothesis: stationary
adf.test(data_CHN$gcf)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_CHN$gcf
## Dickey-Fuller = -2.054, Lag order = 2, p-value = 0.5518
## alternative hypothesis: stationary
adf.test(data_CHN$rd)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_CHN$rd
## Dickey-Fuller = -1.7355, Lag order = 2, p-value = 0.6731
## alternative hypothesis: stationary
adf.test(data_CHN$hc)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_CHN$hc
## Dickey-Fuller = -2.4405, Lag order = 2, p-value = 0.4046
## alternative hypothesis: stationary
adf.test(data_CHN$trade)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_CHN$trade
## Dickey-Fuller = -4.1364, Lag order = 2, p-value = 0.0185
## alternative hypothesis: stationary
# KPSS-тест
# H0: ряд стационарен относительно детерминированного тренда
# H1: ряд нестационарен
# KPSS p < 0.05 -> отвергаем H0, есть признаки нестационарности
kpss.test(data_CHN$ln_tfp, null = "Trend")
## 
##  KPSS Test for Trend Stationarity
## 
## data:  data_CHN$ln_tfp
## KPSS Trend = 0.19586, Truncation lag parameter = 2, p-value = 0.01755
kpss.test(data_CHN$fdi, null = "Trend")
## 
##  KPSS Test for Trend Stationarity
## 
## data:  data_CHN$fdi
## KPSS Trend = 0.14918, Truncation lag parameter = 2, p-value = 0.04735
kpss.test(data_CHN$gcf, null = "Trend")
## 
##  KPSS Test for Trend Stationarity
## 
## data:  data_CHN$gcf
## KPSS Trend = 0.20952, Truncation lag parameter = 2, p-value = 0.01243
kpss.test(data_CHN$rd, null = "Trend")
## 
##  KPSS Test for Trend Stationarity
## 
## data:  data_CHN$rd
## KPSS Trend = 0.12481, Truncation lag parameter = 2, p-value = 0.08924
kpss.test(data_CHN$hc, null = "Trend")
## 
##  KPSS Test for Trend Stationarity
## 
## data:  data_CHN$hc
## KPSS Trend = 0.16785, Truncation lag parameter = 2, p-value = 0.03179
kpss.test(data_CHN$trade, null = "Trend")
## 
##  KPSS Test for Trend Stationarity
## 
## data:  data_CHN$trade
## KPSS Trend = 0.13104, Truncation lag parameter = 2, p-value = 0.0777
# DEU
# ADF-тест
# H0: ряд имеет единичный корень, то есть нестационарен
# H1: ряд стационарен
# ADF p < 0.05 -> отвергаем H0, есть признаки стационарности
adf.test(data_DEU$ln_tfp)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_DEU$ln_tfp
## Dickey-Fuller = -2.5771, Lag order = 2, p-value = 0.3525
## alternative hypothesis: stationary
adf.test(data_DEU$fdi)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_DEU$fdi
## Dickey-Fuller = -3.6303, Lag order = 2, p-value = 0.04784
## alternative hypothesis: stationary
adf.test(data_DEU$gcf)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_DEU$gcf
## Dickey-Fuller = -2.8768, Lag order = 2, p-value = 0.2384
## alternative hypothesis: stationary
adf.test(data_DEU$rd)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_DEU$rd
## Dickey-Fuller = -2.6857, Lag order = 2, p-value = 0.3112
## alternative hypothesis: stationary
adf.test(data_DEU$hc)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_DEU$hc
## Dickey-Fuller = -2.6001, Lag order = 2, p-value = 0.3438
## alternative hypothesis: stationary
adf.test(data_DEU$trade)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_DEU$trade
## Dickey-Fuller = -2.0584, Lag order = 2, p-value = 0.5501
## alternative hypothesis: stationary
adf.test(data_DEU$manuf)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_DEU$manuf
## Dickey-Fuller = -2.3549, Lag order = 2, p-value = 0.4372
## alternative hypothesis: stationary
# KPSS-тест
# H0: ряд стационарен относительно детерминированного тренда
# H1: ряд нестационарен
# KPSS p < 0.05 -> отвергаем H0, есть признаки нестационарности
kpss.test(data_DEU$ln_tfp, null = "Trend")
## Warning in kpss.test(data_DEU$ln_tfp, null = "Trend"): p-value greater than
## printed p-value
## 
##  KPSS Test for Trend Stationarity
## 
## data:  data_DEU$ln_tfp
## KPSS Trend = 0.081035, Truncation lag parameter = 2, p-value = 0.1
kpss.test(data_DEU$fdi, null = "Trend")
## 
##  KPSS Test for Trend Stationarity
## 
## data:  data_DEU$fdi
## KPSS Trend = 0.14191, Truncation lag parameter = 2, p-value = 0.05757
kpss.test(data_DEU$gcf, null = "Trend")
## 
##  KPSS Test for Trend Stationarity
## 
## data:  data_DEU$gcf
## KPSS Trend = 0.17577, Truncation lag parameter = 2, p-value = 0.02519
kpss.test(data_DEU$rd, null = "Trend")
## Warning in kpss.test(data_DEU$rd, null = "Trend"): p-value greater than printed
## p-value
## 
##  KPSS Test for Trend Stationarity
## 
## data:  data_DEU$rd
## KPSS Trend = 0.085492, Truncation lag parameter = 2, p-value = 0.1
kpss.test(data_DEU$hc, null = "Trend")
## 
##  KPSS Test for Trend Stationarity
## 
## data:  data_DEU$hc
## KPSS Trend = 0.20287, Truncation lag parameter = 2, p-value = 0.01492
kpss.test(data_DEU$trade, null = "Trend")
## 
##  KPSS Test for Trend Stationarity
## 
## data:  data_DEU$trade
## KPSS Trend = 0.14993, Truncation lag parameter = 2, p-value = 0.04672
kpss.test(data_DEU$manuf, null = "Trend")
## Warning in kpss.test(data_DEU$manuf, null = "Trend"): p-value greater than
## printed p-value
## 
##  KPSS Test for Trend Stationarity
## 
## data:  data_DEU$manuf
## KPSS Trend = 0.090947, Truncation lag parameter = 2, p-value = 0.1

Китай: ln(TFP), FDI, GCF и HC - non-stationary; Trade - stationary; для R&D результаты неоднозначны. Германия: FDI — stationary; GCF, Trade и HC - non-stationary. Для ln(TFP), R&D и Manufacturing результаты ADF и KPSS неоднозначны. Поскольку в обеих странах несколько ключевых рядов нестационарны, для дальнейшего анализа используем first differences.

# first differences
# Первые разности для China
data_CHN$d_ln_tfp <- c(NA, diff(data_CHN$ln_tfp))
data_CHN$d_fdi    <- c(NA, diff(data_CHN$fdi))
data_CHN$d_gcf    <- c(NA, diff(data_CHN$gcf))
data_CHN$d_rd     <- c(NA, diff(data_CHN$rd))
data_CHN$d_hc     <- c(NA, diff(data_CHN$hc))
data_CHN$d_trade  <- c(NA, diff(data_CHN$trade))

# Первые разности для Germany
data_DEU$d_ln_tfp <- c(NA, diff(data_DEU$ln_tfp))
data_DEU$d_fdi    <- c(NA, diff(data_DEU$fdi))
data_DEU$d_gcf    <- c(NA, diff(data_DEU$gcf))
data_DEU$d_rd     <- c(NA, diff(data_DEU$rd))
data_DEU$d_hc     <- c(NA, diff(data_DEU$hc))
data_DEU$d_trade  <- c(NA, diff(data_DEU$trade))
data_DEU$d_manuf  <- c(NA, diff(data_DEU$manuf))


# Проверка стационарности первых разностей
# ADF: H0 - ряд нестационарен, H1 - ряд стационарен
# KPSS: H0 - ряд стационарен, H1 - ряд нестационарен

# China: ADF
adf.test(na.omit(data_CHN$d_ln_tfp))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(data_CHN$d_ln_tfp)
## Dickey-Fuller = -2.7854, Lag order = 2, p-value = 0.2732
## alternative hypothesis: stationary
adf.test(na.omit(data_CHN$d_fdi))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(data_CHN$d_fdi)
## Dickey-Fuller = -2.8325, Lag order = 2, p-value = 0.2552
## alternative hypothesis: stationary
adf.test(na.omit(data_CHN$d_gcf))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(data_CHN$d_gcf)
## Dickey-Fuller = -3.1455, Lag order = 2, p-value = 0.136
## alternative hypothesis: stationary
adf.test(na.omit(data_CHN$d_rd))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(data_CHN$d_rd)
## Dickey-Fuller = -2.2851, Lag order = 2, p-value = 0.4638
## alternative hypothesis: stationary
adf.test(na.omit(data_CHN$d_hc))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(data_CHN$d_hc)
## Dickey-Fuller = -1.81, Lag order = 2, p-value = 0.6448
## alternative hypothesis: stationary
adf.test(na.omit(data_CHN$d_trade))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(data_CHN$d_trade)
## Dickey-Fuller = -2.2773, Lag order = 2, p-value = 0.4667
## alternative hypothesis: stationary
# China: KPSS
kpss.test(na.omit(data_CHN$d_ln_tfp), null = "Level")
## Warning in kpss.test(na.omit(data_CHN$d_ln_tfp), null = "Level"): p-value
## greater than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  na.omit(data_CHN$d_ln_tfp)
## KPSS Level = 0.28938, Truncation lag parameter = 2, p-value = 0.1
kpss.test(na.omit(data_CHN$d_fdi), null = "Level")
## Warning in kpss.test(na.omit(data_CHN$d_fdi), null = "Level"): p-value greater
## than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  na.omit(data_CHN$d_fdi)
## KPSS Level = 0.22303, Truncation lag parameter = 2, p-value = 0.1
kpss.test(na.omit(data_CHN$d_gcf), null = "Level")
## 
##  KPSS Test for Level Stationarity
## 
## data:  na.omit(data_CHN$d_gcf)
## KPSS Level = 0.42755, Truncation lag parameter = 2, p-value = 0.06528
kpss.test(na.omit(data_CHN$d_rd), null = "Level")
## Warning in kpss.test(na.omit(data_CHN$d_rd), null = "Level"): p-value greater
## than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  na.omit(data_CHN$d_rd)
## KPSS Level = 0.083207, Truncation lag parameter = 2, p-value = 0.1
kpss.test(na.omit(data_CHN$d_hc), null = "Level")
## Warning in kpss.test(na.omit(data_CHN$d_hc), null = "Level"): p-value greater
## than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  na.omit(data_CHN$d_hc)
## KPSS Level = 0.17024, Truncation lag parameter = 2, p-value = 0.1
kpss.test(na.omit(data_CHN$d_trade), null = "Level")
## Warning in kpss.test(na.omit(data_CHN$d_trade), null = "Level"): p-value
## greater than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  na.omit(data_CHN$d_trade)
## KPSS Level = 0.20661, Truncation lag parameter = 2, p-value = 0.1
# Germany: ADF
adf.test(na.omit(data_DEU$d_ln_tfp))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(data_DEU$d_ln_tfp)
## Dickey-Fuller = -3.856, Lag order = 2, p-value = 0.03172
## alternative hypothesis: stationary
adf.test(na.omit(data_DEU$d_fdi))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(data_DEU$d_fdi)
## Dickey-Fuller = -3.0093, Lag order = 2, p-value = 0.1879
## alternative hypothesis: stationary
adf.test(na.omit(data_DEU$d_gcf))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(data_DEU$d_gcf)
## Dickey-Fuller = -3.0396, Lag order = 2, p-value = 0.1763
## alternative hypothesis: stationary
adf.test(na.omit(data_DEU$d_rd))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(data_DEU$d_rd)
## Dickey-Fuller = -2.0557, Lag order = 2, p-value = 0.5511
## alternative hypothesis: stationary
adf.test(na.omit(data_DEU$d_hc))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(data_DEU$d_hc)
## Dickey-Fuller = -0.78031, Lag order = 2, p-value = 0.9516
## alternative hypothesis: stationary
adf.test(na.omit(data_DEU$d_trade))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(data_DEU$d_trade)
## Dickey-Fuller = -4.154, Lag order = 2, p-value = 0.01788
## alternative hypothesis: stationary
adf.test(na.omit(data_DEU$d_manuf))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(data_DEU$d_manuf)
## Dickey-Fuller = -3.8114, Lag order = 2, p-value = 0.0349
## alternative hypothesis: stationary
# Germany: KPSS
kpss.test(na.omit(data_DEU$d_ln_tfp), null = "Level")
## Warning in kpss.test(na.omit(data_DEU$d_ln_tfp), null = "Level"): p-value
## greater than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  na.omit(data_DEU$d_ln_tfp)
## KPSS Level = 0.060129, Truncation lag parameter = 2, p-value = 0.1
kpss.test(na.omit(data_DEU$d_fdi), null = "Level")
## Warning in kpss.test(na.omit(data_DEU$d_fdi), null = "Level"): p-value greater
## than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  na.omit(data_DEU$d_fdi)
## KPSS Level = 0.33144, Truncation lag parameter = 2, p-value = 0.1
kpss.test(na.omit(data_DEU$d_gcf), null = "Level")
## Warning in kpss.test(na.omit(data_DEU$d_gcf), null = "Level"): p-value greater
## than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  na.omit(data_DEU$d_gcf)
## KPSS Level = 0.30758, Truncation lag parameter = 2, p-value = 0.1
kpss.test(na.omit(data_DEU$d_rd), null = "Level")
## Warning in kpss.test(na.omit(data_DEU$d_rd), null = "Level"): p-value greater
## than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  na.omit(data_DEU$d_rd)
## KPSS Level = 0.11109, Truncation lag parameter = 2, p-value = 0.1
kpss.test(na.omit(data_DEU$d_hc), null = "Level")
## Warning in kpss.test(na.omit(data_DEU$d_hc), null = "Level"): p-value greater
## than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  na.omit(data_DEU$d_hc)
## KPSS Level = 0.33696, Truncation lag parameter = 2, p-value = 0.1
kpss.test(na.omit(data_DEU$d_trade), null = "Level")
## Warning in kpss.test(na.omit(data_DEU$d_trade), null = "Level"): p-value
## greater than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  na.omit(data_DEU$d_trade)
## KPSS Level = 0.096198, Truncation lag parameter = 2, p-value = 0.1
kpss.test(na.omit(data_DEU$d_manuf), null = "Level")
## Warning in kpss.test(na.omit(data_DEU$d_manuf), null = "Level"): p-value
## greater than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  na.omit(data_DEU$d_manuf)
## KPSS Level = 0.058306, Truncation lag parameter = 2, p-value = 0.1

Китай: для всех first differences результаты ADF и KPSS неоднозначны, при этом KPSS не отвергает стационарность ни для одного ряда. Германия: Δln(TFP), ΔTrade и ΔManufacturing - stationary; для ΔFDI, ΔGCF, ΔR&D и ΔHC результаты ADF и KPSS неоднозначны. В целом переход к first differences существенно улучшает свойства рядов, KPSS подтверждает их стационарность, поэтому далее используем модели в первых разностях.

  1. Модели в первых разностях
# China
m_diff1_CHN <- lm(d_ln_tfp ~ d_fdi + d_gcf + d_rd + d_trade, data = data_CHN)
m_diff2_CHN <- lm(d_ln_tfp ~ d_fdi + d_gcf + d_hc + d_trade, data = data_CHN)

# Germany
m_diff1_DEU <- lm(d_ln_tfp ~ d_fdi + d_gcf + d_rd + d_trade, data = data_DEU)
m_diff2_DEU <- lm(d_ln_tfp ~ d_fdi + d_gcf + d_hc + d_trade, data = data_DEU)

# Germany + Manufacturing
m_diff1_manuf_DEU <- lm(d_ln_tfp ~ d_fdi + d_gcf + d_rd + d_trade + d_manuf, data = data_DEU)
m_diff2_manuf_DEU <- lm(d_ln_tfp ~ d_fdi + d_gcf + d_hc + d_trade + d_manuf, data = data_DEU)

# Вывод результатов
modelsummary(
  list(
    "China: R&D" = m_diff1_CHN,
    "China: HC" = m_diff2_CHN,
    "Germany: R&D" = m_diff1_DEU,
    "Germany: HC" = m_diff2_DEU,
    "Germany: R&D + Manuf." = m_diff1_manuf_DEU,
    "Germany: HC + Manuf." = m_diff2_manuf_DEU),
  statistic = "std.error",
  stars = c("*" = 0.1, "**" = 0.05, "***" = 0.01),
  coef_map = c(
    "(Intercept)" = "Constant",
    "d_fdi" = "Δ FDI",
    "d_gcf" = "Δ GCF",
    "d_rd" = "Δ R&D",
    "d_hc" = "Δ HC",
    "d_trade" = "Δ Trade",
    "d_manuf" = "Δ Manufacturing"),
  gof_omit = "IC|Log|Adj|RMSE|Std.Errors", output = "flextable", fmt = 3) %>%
  fontsize(size = 8, part = "all") %>% autofit()

China: R&D

China: HC

Germany: R&D

Germany: HC

Germany: R&D + Manuf.

Germany: HC + Manuf.

Constant

0.045***

0.041***

0.002

0.007*

0.002

0.008***

(0.008)

(0.012)

(0.002)

(0.004)

(0.002)

(0.003)

Δ FDI

-0.002

-0.000

-0.001

-0.001

-0.001*

-0.001**

(0.009)

(0.010)

(0.001)

(0.001)

(0.001)

(0.000)

Δ GCF

0.004

0.001

0.005**

0.004*

0.003*

0.002

(0.003)

(0.004)

(0.002)

(0.002)

(0.002)

(0.001)

Δ R&D

-0.227**

-0.011

0.013

(0.095)

(0.038)

(0.029)

Δ HC

-0.634

-0.976

-1.055**

(0.533)

(0.607)

(0.411)

Δ Trade

-0.001

-0.000

0.001**

0.002***

0.001*

0.001***

(0.001)

(0.001)

(0.001)

(0.001)

(0.000)

(0.000)

Δ Manufacturing

0.009***

0.009***

(0.002)

(0.002)

Num.Obs.

23

23

23

23

23

23

R2

0.256

0.092

0.696

0.733

0.842

0.885

F

1.548

0.455

10.316

12.368

18.077

26.056

* p < 0.1, ** p < 0.05, *** p < 0.01

Китай: FDI статистически незначим в обеих моделях. R&D имеет значимый отрицательный коэффициент, остальные факторы незначимы. Германия: без Manufacturing FDI незначим, а GCF и Trade положительно значимы. После добавления Manufacturing качество моделей заметно растет: Manufacturing значим и положителен, а FDI становится отрицательно значимым только в модели с HC.

  1. FDI LAG(1) MODELS
# Лаг изменения FDI на 1 год
data_CHN$d_fdi_lag1 <- c(NA, head(data_CHN$d_fdi, -1))
data_DEU$d_fdi_lag1 <- c(NA, head(data_DEU$d_fdi, -1))

# China
m_lag1_rd_CHN <- lm(d_ln_tfp ~ d_fdi_lag1 + d_gcf + d_rd + d_trade, data = data_CHN)
m_lag1_hc_CHN <- lm(d_ln_tfp ~ d_fdi_lag1 + d_gcf + d_hc + d_trade, data = data_CHN)

# Germany
m_lag1_rd_DEU <- lm(d_ln_tfp ~ d_fdi_lag1 + d_gcf + d_rd + d_trade, data = data_DEU)
m_lag1_hc_DEU <- lm(d_ln_tfp ~ d_fdi_lag1 + d_gcf + d_hc + d_trade, data = data_DEU)

# Germany + Manufacturing
m_lag1_rd_manuf_DEU <- lm(d_ln_tfp ~ d_fdi_lag1 + d_gcf + d_rd + d_trade + d_manuf, data = data_DEU)
m_lag1_hc_manuf_DEU <- lm(d_ln_tfp ~ d_fdi_lag1 + d_gcf + d_hc + d_trade + d_manuf, data = data_DEU)

# Вывод результатов
modelsummary(
  list(
    "China: R&D" = m_lag1_rd_CHN,
    "China: HC" = m_lag1_hc_CHN,
    "Germany: R&D" = m_lag1_rd_DEU,
    "Germany: HC" = m_lag1_hc_DEU,
    "Germany: R&D + Manuf." = m_lag1_rd_manuf_DEU,
    "Germany: HC + Manuf." = m_lag1_hc_manuf_DEU),
  statistic = "std.error",
  stars = c("*" = 0.1, "**" = 0.05, "***" = 0.01),
  coef_map = c(
    "(Intercept)" = "Constant",
    "d_fdi_lag1" = "Δ FDI (t-1)",
    "d_gcf" = "Δ GCF",
    "d_rd" = "Δ R&D",
    "d_hc" = "Δ HC",
    "d_trade" = "Δ Trade",
    "d_manuf" = "Δ Manufacturing"),
  gof_omit = "IC|Log|Adj|RMSE|Std.Errors", output = "flextable", fmt = 3) %>%
  fontsize(size = 8, part = "all") %>% autofit()

China: R&D

China: HC

Germany: R&D

Germany: HC

Germany: R&D + Manuf.

Germany: HC + Manuf.

Constant

0.048***

0.044***

0.001

0.007

0.001

0.008***

(0.007)

(0.010)

(0.002)

(0.004)

(0.002)

(0.003)

Δ FDI (t-1)

0.015**

0.016**

-0.000

-0.000

-0.001

-0.001

(0.007)

(0.008)

(0.001)

(0.001)

(0.001)

(0.001)

Δ GCF

0.006*

0.002

0.005**

0.004*

0.004*

0.002

(0.003)

(0.003)

(0.002)

(0.002)

(0.002)

(0.002)

Δ R&D

-0.241**

-0.008

0.017

(0.085)

(0.039)

(0.029)

Δ HC

-0.688

-1.011

-1.089**

(0.484)

(0.611)

(0.402)

Δ Trade

-0.002

-0.001

0.001**

0.002***

0.001**

0.001***

(0.001)

(0.001)

(0.001)

(0.001)

(0.000)

(0.000)

Δ Manufacturing

0.009***

0.009***

(0.002)

(0.002)

Num.Obs.

22

22

22

22

22

22

R2

0.461

0.290

0.702

0.743

0.851

0.896

F

3.632

1.739

10.002

12.260

18.231

27.428

* p < 0.1, ** p < 0.05, *** p < 0.01

Китай: лаг FDI на 1 год положительный и статистически значимый в обеих моделях. R&D имеет значимый отрицательный эффект, остальные факторы в основном незначимы. Германия: лаг FDI на 1 год статистически незначим во всех моделях. GCF и Trade дают положительный эффект, а после добавления Manufacturing, Manufacturing становится сильно положительно значимым. То есть отложенный эффект FDI через 1 год проявляется для Китая, но не для Германии.

  1. FDI LAG(2) MODELS
# Лаг изменения FDI на 2 года
data_CHN$d_fdi_lag2 <- c(NA, NA, head(data_CHN$d_fdi, -2))
data_DEU$d_fdi_lag2 <- c(NA, NA, head(data_DEU$d_fdi, -2))

# China
m_lag2_rd_CHN <- lm(d_ln_tfp ~ d_fdi_lag2 + d_gcf + d_rd + d_trade, data = data_CHN)
m_lag2_hc_CHN <- lm(d_ln_tfp ~ d_fdi_lag2 + d_gcf + d_hc + d_trade, data = data_CHN)

# Germany
m_lag2_rd_DEU <- lm(d_ln_tfp ~ d_fdi_lag2 + d_gcf + d_rd + d_trade, data = data_DEU)
m_lag2_hc_DEU <- lm(d_ln_tfp ~ d_fdi_lag2 + d_gcf + d_hc + d_trade, data = data_DEU)

# Germany + Manufacturing
m_lag2_rd_manuf_DEU <- lm(d_ln_tfp ~ d_fdi_lag2 + d_gcf + d_rd + d_trade + d_manuf, data = data_DEU)
m_lag2_hc_manuf_DEU <- lm(d_ln_tfp ~ d_fdi_lag2 + d_gcf + d_hc + d_trade + d_manuf, data = data_DEU)

# Вывод результатов
modelsummary(
  list(
    "China: R&D" = m_lag2_rd_CHN,
    "China: HC" = m_lag2_hc_CHN,
    "Germany: R&D" = m_lag2_rd_DEU,
    "Germany: HC" = m_lag2_hc_DEU,
    "Germany: R&D + Manuf." = m_lag2_rd_manuf_DEU,
    "Germany: HC + Manuf." = m_lag2_hc_manuf_DEU),
  statistic = "std.error",
  stars = c("*" = 0.1, "**" = 0.05, "***" = 0.01),
  coef_map = c(
    "(Intercept)" = "Constant",
    "d_fdi_lag2" = "Δ FDI (t-2)",
    "d_gcf" = "Δ GCF",
    "d_rd" = "Δ R&D",
    "d_hc" = "Δ HC",
    "d_trade" = "Δ Trade",
    "d_manuf" = "Δ Manufacturing"),
  gof_omit = "IC|Log|Adj|RMSE|Std.Errors", output = "flextable", fmt = 3) %>%
  fontsize(size = 8, part = "all") %>% autofit()

China: R&D

China: HC

Germany: R&D

Germany: HC

Germany: R&D + Manuf.

Germany: HC + Manuf.

Constant

0.053***

0.041***

0.001

0.007*

0.001

0.008***

(0.008)

(0.012)

(0.002)

(0.004)

(0.002)

(0.002)

Δ FDI (t-2)

0.015*

0.006

-0.000

-0.001

0.000

-0.000

(0.007)

(0.009)

(0.001)

(0.001)

(0.001)

(0.000)

Δ GCF

0.006*

0.002

0.006**

0.005**

0.004**

0.003*

(0.003)

(0.004)

(0.002)

(0.002)

(0.002)

(0.001)

Δ R&D

-0.324***

-0.002

0.019

(0.095)

(0.038)

(0.027)

Δ HC

-0.560

-1.155*

-1.083**

(0.567)

(0.603)

(0.393)

Δ Trade

-0.001

-0.000

0.001**

0.002***

0.001*

0.001***

(0.001)

(0.001)

(0.001)

(0.001)

(0.000)

(0.000)

Δ Manufacturing

0.009***

0.009***

(0.002)

(0.002)

Num.Obs.

21

21

21

21

21

21

R2

0.461

0.122

0.730

0.780

0.872

0.913

F

3.419

0.554

10.788

14.166

20.526

31.335

* p < 0.1, ** p < 0.05, *** p < 0.01

Китай: лаг FDI на 2 года положителен, но не незначим. R&D сохраняет значимый отрицательный эффект. Германия: лаг FDI на 2 года незначим во всех моделях. GCF и Trade положительно значимы, а Manufacturing остается сильным положительным фактором. Устойчивого двухлетнего эффекта FDI на TFP не наблюдается, наиболее заметный отложенный эффект FDI остается у Китая на лаге 1.

  1. DISTRIBUTED LAG MODELS
# Включаем в модель одновременно d_fdi, d_fdi_lag1, d_fdi_lag2
# China
m_dl_rd_CHN <- lm(d_ln_tfp ~ d_fdi + d_fdi_lag1 + d_fdi_lag2 + d_gcf + d_rd + d_trade, data = data_CHN)
m_dl_hc_CHN <- lm(d_ln_tfp ~ d_fdi + d_fdi_lag1 + d_fdi_lag2 + d_gcf + d_hc + d_trade, data = data_CHN)

# Germany
m_dl_rd_DEU <- lm(d_ln_tfp ~ d_fdi + d_fdi_lag1 + d_fdi_lag2 + d_gcf + d_rd + d_trade, data = data_DEU)
m_dl_hc_DEU <- lm(d_ln_tfp ~ d_fdi + d_fdi_lag1 + d_fdi_lag2 + d_gcf + d_hc + d_trade, data = data_DEU)

# Germany + Manufacturing
m_dl_rd_manuf_DEU <- lm(d_ln_tfp ~ d_fdi + d_fdi_lag1 + d_fdi_lag2 + d_gcf + d_rd + d_trade + d_manuf, data = data_DEU)
m_dl_hc_manuf_DEU <- lm(d_ln_tfp ~ d_fdi + d_fdi_lag1 + d_fdi_lag2 + d_gcf + d_hc + d_trade + d_manuf, data = data_DEU)

# Вывод результатов
modelsummary(
  list(
    "China: R&D" = m_dl_rd_CHN,
    "China: HC" = m_dl_hc_CHN,
    "Germany: R&D" = m_dl_rd_DEU,
    "Germany: HC" = m_dl_hc_DEU,
    "Germany: R&D + Manuf." = m_dl_rd_manuf_DEU,
    "Germany: HC + Manuf." = m_dl_hc_manuf_DEU),
  statistic = "std.error",
  stars = c("*" = 0.1, "**" = 0.05, "***" = 0.01),
  coef_map = c(
    "(Intercept)" = "Constant",
    "d_fdi" = "Δ FDI",
    "d_fdi_lag1" = "Δ FDI (t-1)",
    "d_fdi_lag2" = "Δ FDI (t-2)",
    "d_gcf" = "Δ GCF",
    "d_rd" = "Δ R&D",
    "d_hc" = "Δ HC",
    "d_trade" = "Δ Trade",
    "d_manuf" = "Δ Manufacturing"),
  gof_omit = "IC|Log|Adj|RMSE|Std.Errors", output = "flextable", fmt = 3) %>%
  fontsize(size = 8, part = "all") %>% autofit()

China: R&D

China: HC

Germany: R&D

Germany: HC

Germany: R&D + Manuf.

Germany: HC + Manuf.

Constant

0.057***

0.044***

0.001

0.007

0.002

0.008***

(0.006)

(0.011)

(0.003)

(0.004)

(0.002)

(0.003)

Δ FDI

0.014*

0.012

0.000

-0.000

0.000

-0.000

(0.006)

(0.010)

(0.002)

(0.002)

(0.001)

(0.001)

Δ FDI (t-1)

0.022***

0.022**

0.001

0.001

0.001

0.001

(0.005)

(0.008)

(0.002)

(0.002)

(0.001)

(0.001)

Δ FDI (t-2)

0.022***

0.013

-0.000

-0.001

0.000

0.000

(0.006)

(0.009)

(0.001)

(0.001)

(0.001)

(0.001)

Δ GCF

0.009***

0.004

0.006*

0.005*

0.004

0.003

(0.002)

(0.004)

(0.003)

(0.003)

(0.002)

(0.002)

Δ R&D

-0.329***

-0.006

0.016

(0.068)

(0.040)

(0.029)

Δ HC

-0.530

-1.120

-1.044**

(0.501)

(0.648)

(0.419)

Δ Trade

-0.003***

-0.002

0.001**

0.002**

0.001*

0.001***

(0.001)

(0.001)

(0.001)

(0.001)

(0.000)

(0.000)

Δ Manufacturing

0.009***

0.009***

(0.002)

(0.002)

Num.Obs.

21

21

21

21

21

21

R2

0.761

0.405

0.740

0.786

0.880

0.917

F

7.445

1.588

6.652

8.554

13.592

20.484

* p < 0.1, ** p < 0.05, *** p < 0.01

Китай: в distributed lag модели эффект FDI наиболее выражен с лагом 1 года, а в модели с R&D также значим лаг 2. R&D и Trade отрицательно значимы, GCF положительно значим. Германия: текущий FDI и оба лага статистически незначимы во всех спецификациях. Основные факторы - положительный Trade и положительный Manufacturing. Таким образом, для Китая есть отложенный положительный эффект FDI, особенно через 1 год, тогда как для Германии значимого текущего или лагового эффекта FDI не выявлено.

  1. Диагностика основной модели
# 1) Автокорреляция: Breusch-Godfrey
bgtest(m_lag1_rd_CHN, order = 1)
## 
##  Breusch-Godfrey test for serial correlation of order up to 1
## 
## data:  m_lag1_rd_CHN
## LM test = 3.0067, df = 1, p-value = 0.08292
bgtest(m_lag1_rd_DEU, order = 1)
## 
##  Breusch-Godfrey test for serial correlation of order up to 1
## 
## data:  m_lag1_rd_DEU
## LM test = 0.1204, df = 1, p-value = 0.7286
# 2) Гетероскедастичность: Breusch-Pagan
bptest(m_lag1_rd_CHN)
## 
##  studentized Breusch-Pagan test
## 
## data:  m_lag1_rd_CHN
## BP = 4.5371, df = 4, p-value = 0.3382
bptest(m_lag1_rd_DEU)
## 
##  studentized Breusch-Pagan test
## 
## data:  m_lag1_rd_DEU
## BP = 3.0905, df = 4, p-value = 0.5428
# 3) Мультиколлинеарность
vif(m_lag1_rd_CHN)
## d_fdi_lag1      d_gcf       d_rd    d_trade 
##   1.056300   1.159612   1.226990   1.240316
vif(m_lag1_rd_DEU)
## d_fdi_lag1      d_gcf       d_rd    d_trade 
##   1.585198   2.420224   1.168883   1.738877
# 4) RESET-тест Рамсея
resettest(m_lag1_rd_CHN, power = 2:3, type = "fitted")
## 
##  RESET test
## 
## data:  m_lag1_rd_CHN
## RESET = 1.069, df1 = 2, df2 = 15, p-value = 0.3681
resettest(m_lag1_rd_DEU, power = 2:3, type = "fitted")
## 
##  RESET test
## 
## data:  m_lag1_rd_DEU
## RESET = 4.2938, df1 = 2, df2 = 15, p-value = 0.03354
# 5) Нормальность остатков: Shapiro-Wilk
shapiro.test(residuals(m_lag1_rd_CHN))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(m_lag1_rd_CHN)
## W = 0.9216, p-value = 0.08207
shapiro.test(residuals(m_lag1_rd_DEU))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(m_lag1_rd_DEU)
## W = 0.93143, p-value = 0.1314

Диагностика основной спецификации показывает, что сильных нарушений предпосылок модели не выявлено. Тест Бреуша-Пагана не обнаружил гетероскедастичности ни для Китая, ни для Германии, а значения VIF - низкие, поэтому проблема мультиколлинеарности отсутствует. Тест Шапиро-Уилка не позволяет отвергнуть нормальность распределения остатков. Для Китая тест Бреуша-Годфрея дает p-value около 0.083, поэтому на 5%-м уровне автокорреляция не подтверждается, хотя на 10%-м уровне можно говорить о слабых признаках существующей зависимости. Для Германии автокорреляция не выявлена. При этом RESET-тест для Германии оказался статистически значимым, что может указывать на неполную спецификацию модели, например на пропущенную нелинейность или дополнительные динамические эффекты.

  1. Формальная проверка разницы China VS Germany
data_pool <- bind_rows(
  data_CHN %>% select(d_ln_tfp, d_fdi_lag1, d_gcf, d_rd, d_trade) %>% mutate(country = "China"),
  data_DEU %>% select(d_ln_tfp, d_fdi_lag1, d_gcf, d_rd, d_trade) %>% mutate(country = "Germany"))

data_pool$country <- factor(data_pool$country, levels = c("China", "Germany"))
m_pool <- lm(d_ln_tfp ~ country * (d_fdi_lag1 + d_gcf + d_rd + d_trade), data = data_pool)

# Вывод результатов
modelsummary(
  list(
    "Pooled model: China vs Germany" = m_pool),
  statistic = "std.error",
  stars = c("*" = 0.1, "**" = 0.05, "***" = 0.01),
  coef_map = c(
    "(Intercept)" = "Constant",
    "countryGermany" = "Germany",
    "d_fdi_lag1" = "Δ FDI (t-1)",
    "d_gcf" = "Δ GCF",
    "d_rd" = "Δ R&D",
    "d_trade" = "Δ Trade",
    "countryGermany:d_fdi_lag1" = "Germany × Δ FDI (t-1)",
    "countryGermany:d_gcf" = "Germany × Δ GCF",
    "countryGermany:d_rd" = "Germany × Δ R&D",
    "countryGermany:d_trade" = "Germany × Δ Trade"),
  gof_omit = "IC|Log|Adj|RMSE|Std.Errors",
  output = "flextable",
  fmt = 3) %>%
  fontsize(size = 8, part = "all") %>% autofit()

Pooled model: China vs Germany

Constant

0.048***

(0.006)

Germany

-0.047***

(0.007)

Δ FDI (t-1)

0.015***

(0.005)

Δ GCF

0.006**

(0.002)

Δ R&D

-0.241***

(0.067)

Δ Trade

-0.002**

(0.001)

Germany × Δ FDI (t-1)

-0.015***

(0.005)

Germany × Δ GCF

-0.001

(0.004)

Germany × Δ R&D

0.233**

(0.091)

Germany × Δ Trade

0.003**

(0.001)

Num.Obs.

44

R2

0.705

F

9.038

* p < 0.1, ** p < 0.05, *** p < 0.01

Формальная проверка подтверждает статистически значимое различие эффекта FDI между Китаем и Германией. В pooled-модели с одинаковым набором контрольных переменных для обеих стран коэффициент ΔFDI(t−1) для Китая положителен и статистически значим (β = 0.015, p < 0.01), тогда как для Германии соответствующий эффект практически равен нулю: 0.015 - 0.0154 = -0.0004. Коэффициент взаимодействия Germany × ΔFDI(t−1) отрицателен и статистически значим (β = −0.015, p < 0.01), поэтому нулевая гипотеза о равенстве коэффициентов FDI между странами отвергается. Это означает, что выявленное различие не сводится только к тому, что коэффициент значим в Китае и незначим в Германии: сами оценки эффекта статистически различаются. Это подтверждает основной вывод работы о том, что лагированная связь FDI с динамикой TFP выражена в Китае значительно сильнее, чем в Германии, при сопоставимой спецификации модели.

  1. Проверка робастности: fdi_stock
# Проверка стационарности FDI stock
adf.test(data_CHN$fdi_stock)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_CHN$fdi_stock
## Dickey-Fuller = -0.16073, Lag order = 2, p-value = 0.9895
## alternative hypothesis: stationary
kpss.test(data_CHN$fdi_stock, null = "Trend")
## Warning in kpss.test(data_CHN$fdi_stock, null = "Trend"): p-value smaller than
## printed p-value
## 
##  KPSS Test for Trend Stationarity
## 
## data:  data_CHN$fdi_stock
## KPSS Trend = 0.2167, Truncation lag parameter = 2, p-value = 0.01
adf.test(data_DEU$fdi_stock)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_DEU$fdi_stock
## Dickey-Fuller = -2.0519, Lag order = 2, p-value = 0.5526
## alternative hypothesis: stationary
kpss.test(data_DEU$fdi_stock, null = "Trend")
## Warning in kpss.test(data_DEU$fdi_stock, null = "Trend"): p-value greater than
## printed p-value
## 
##  KPSS Test for Trend Stationarity
## 
## data:  data_DEU$fdi_stock
## KPSS Trend = 0.08792, Truncation lag parameter = 2, p-value = 0.1

FDI inward stock для Китая является нестационарным, для Германии результаты ADF и KPSS неоднозначны. Для сопоставимости с основной спецификацией проверка робастности проводится в первых разностях FDI stock

# Первые разности
data_CHN$d_fdi_stock <- c(NA, diff(data_CHN$fdi_stock))
data_DEU$d_fdi_stock <- c(NA, diff(data_DEU$fdi_stock))

# Проверка стационарности
adf.test(na.omit(data_CHN$d_fdi_stock))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(data_CHN$d_fdi_stock)
## Dickey-Fuller = -4.0019, Lag order = 2, p-value = 0.02319
## alternative hypothesis: stationary
kpss.test(na.omit(data_CHN$d_fdi_stock), null = "Level")
## 
##  KPSS Test for Level Stationarity
## 
## data:  na.omit(data_CHN$d_fdi_stock)
## KPSS Level = 0.50856, Truncation lag parameter = 2, p-value = 0.03974
adf.test(na.omit(data_DEU$d_fdi_stock))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(data_DEU$d_fdi_stock)
## Dickey-Fuller = -2.9684, Lag order = 2, p-value = 0.2034
## alternative hypothesis: stationary
kpss.test(na.omit(data_DEU$d_fdi_stock), null = "Level")
## Warning in kpss.test(na.omit(data_DEU$d_fdi_stock), null = "Level"): p-value
## greater than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  na.omit(data_DEU$d_fdi_stock)
## KPSS Level = 0.082429, Truncation lag parameter = 2, p-value = 0.1

После перехода к первым разностям свойства FDI stock улучшаются, однако результаты ADF и KPSS остаются неоднозначными для обеих стран.

# Лаг 1 для FDI stock
data_CHN$d_fdi_stock_lag1 <- c(NA, head(data_CHN$d_fdi_stock, -1))
data_DEU$d_fdi_stock_lag1 <- c(NA, head(data_DEU$d_fdi_stock, -1))

# R&D
m_stock_rd_CHN <- lm(d_ln_tfp ~ d_fdi_stock_lag1 + d_gcf + d_rd + d_trade, data = data_CHN)
m_stock_rd_DEU <- lm(d_ln_tfp ~ d_fdi_stock_lag1 + d_gcf + d_rd + d_trade, data = data_DEU)

# HC
m_stock_hc_CHN <- lm(d_ln_tfp ~ d_fdi_stock_lag1 + d_gcf + d_hc + d_trade, data = data_CHN)
m_stock_hc_DEU <- lm(d_ln_tfp ~ d_fdi_stock_lag1 + d_gcf + d_hc + d_trade, data = data_DEU)

# Вывод результатов
modelsummary(
  list(
    "China: R&D" = m_stock_rd_CHN,
    "China: HC" = m_stock_hc_CHN,
    "Germany: R&D" = m_stock_rd_DEU,
    "Germany: HC" = m_stock_hc_DEU),
  statistic = "std.error",
  stars = c("*" = 0.1, "**" = 0.05, "***" = 0.01),
  coef_map = c(
    "(Intercept)" = "Constant",
    "d_fdi_stock_lag1" = "Δ FDI Stock (t-1)",
    "d_gcf" = "Δ GCF",
    "d_rd" = "Δ R&D",
    "d_hc" = "Δ HC",
    "d_trade" = "Δ Trade"),
  gof_omit = "IC|Log|Adj|RMSE|Std.Errors",
  output = "flextable",
  fmt = 3) %>%
  fontsize(size = 8, part = "all") %>% autofit()

China: R&D

China: HC

Germany: R&D

Germany: HC

Constant

0.047***

0.045***

0.002

0.007*

(0.007)

(0.010)

(0.002)

(0.004)

Δ FDI Stock (t-1)

-0.005**

-0.006**

-0.000

0.000

(0.002)

(0.002)

(0.001)

(0.001)

Δ GCF

0.004

-0.000

0.005**

0.003

(0.003)

(0.003)

(0.002)

(0.002)

Δ R&D

-0.224**

-0.012

(0.084)

(0.040)

Δ HC

-0.718

-1.092

(0.462)

(0.644)

Δ Trade

-0.001

0.000

0.001**

0.002***

(0.001)

(0.001)

(0.001)

(0.001)

Num.Obs.

22

22

22

22

R2

0.481

0.354

0.699

0.741

F

3.941

2.334

9.869

12.169

* p < 0.1, ** p < 0.05, *** p < 0.01

Использование FDI inward stock как альтернативной меры FDI подтверждает различие между Китаем и Германией, однако не подтверждает устойчивость знака эффекта для Китая. В отличие от основной модели с FDI inflows, где лагированный эффект положителен, изменение FDI stock с лагом в один год связано с изменением TFP отрицательно и статистически значимо. Для Германии эффект остается близким к нулю и незначимым. Вывод о наличии связи FDI с TFP в Китае сохраняется, но ее направление чувствительно к используемой мере FDI.

  1. Гетерогенность для Китая
# Данные для основной модели
chn_break <- na.omit(data_CHN[, c("year", "d_ln_tfp", "d_fdi_lag1", "d_gcf", "d_rd", "d_trade", "d_hc")])

# Возможные точки структурного разрыва
bp30 <- breakpoints(d_ln_tfp ~ d_fdi_lag1 + d_gcf + d_rd + d_trade, data = chn_break, h = 0.3, breaks = 1)
bp35 <- breakpoints(d_ln_tfp ~ d_fdi_lag1 + d_gcf + d_rd + d_trade, data = chn_break, h = 0.35, breaks = 1)
bp40 <- breakpoints(d_ln_tfp ~ d_fdi_lag1 + d_gcf + d_rd + d_trade, data = chn_break, h = 0.4, breaks = 1)

# Год разрыва
chn_break$year[bp30$breakpoints]
## [1] 2007
chn_break$year[bp35$breakpoints]
## [1] 2008
chn_break$year[bp40$breakpoints]
## [1] 2009
# Тоже самое проделаем для модели с HC вместо R&D для проверки стабильности результатов:
# Возможные точки структурного разрыва
bp30_hc <- breakpoints(d_ln_tfp ~ d_fdi_lag1 + d_gcf + d_hc + d_trade, data = chn_break, h = 0.3, breaks = 1)
bp35_hc <- breakpoints(d_ln_tfp ~ d_fdi_lag1 + d_gcf + d_hc + d_trade, data = chn_break, h = 0.35, breaks = 1)
bp40_hc <- breakpoints(d_ln_tfp ~ d_fdi_lag1 + d_gcf + d_hc + d_trade, data = chn_break, h = 0.4, breaks = 1)

# Год разрыва
chn_break$year[bp30_hc$breakpoints]
## [1] 2008
chn_break$year[bp35_hc$breakpoints]
## [1] 2008
chn_break$year[bp40_hc$breakpoints]
## [1] 2009
# Тест наличия структурного разрыва
fs <- Fstats(d_ln_tfp ~ d_fdi_lag1 + d_gcf + d_rd + d_trade, data = chn_break, from = 0.35, to = 0.7)
sctest(fs)
## 
##  supF test
## 
## data:  fs
## sup.F = 31.849, p-value = 0.000105
plot(fs)

fs_hc <- Fstats(d_ln_tfp ~ d_fdi_lag1 + d_gcf + d_hc + d_trade, data = chn_break, from = 0.35, to = 0.7)
sctest(fs_hc)
## 
##  supF test
## 
## data:  fs_hc
## sup.F = 34.751, p-value = 3.036e-05
plot(fs_hc)

Формальный тест структурного разрыва подтверждает наличие значимого изменения параметров модели. В зависимости от минимальной длины сегмента точка разрыва приходится на 2007–2009 гг. В качестве репрезентативной даты выбран 2008 год, находящийся в центре выявленного диапазона и совпадающий с глобальным финансовым кризисом, который существенно изменил условия международных потоков капитала и динамику иностранных инвестиций.

break_year <- 2008
data_CHN$post <- ifelse(data_CHN$year >= break_year, 1, 0)

# Гетерогенность эффекта FDI lag 1 до и после 2008 года
m_het_rd_CHN <- lm(d_ln_tfp ~ d_fdi_lag1 * post + d_gcf + d_rd + d_trade, data = data_CHN)
m_het_hc_CHN <- lm(d_ln_tfp ~ d_fdi_lag1 * post + d_gcf + d_hc + d_trade, data = data_CHN)

modelsummary(
  list(
    "China: R&D" = m_het_rd_CHN,
    "China: HC" = m_het_hc_CHN),
  statistic = "std.error",
  stars = c("*" = 0.1, "**" = 0.05, "***" = 0.01),
  coef_map = c(
    "(Intercept)" = "Constant",
    "d_fdi_lag1" = "Δ FDI (t-1)",
    "post" = "Post-2008",
    "d_fdi_lag1:post" = "Δ FDI (t-1) × Post",
    "d_gcf" = "Δ GCF",
    "d_rd" = "Δ R&D",
    "d_hc" = "Δ HC",
    "d_trade" = "Δ Trade"),
  gof_omit = "IC|Log|Adj|RMSE|Std.Errors",
  output = "flextable",
  fmt = 3) %>%
  fontsize(size = 8, part = "all") %>%
  autofit()

China: R&D

China: HC

Constant

0.074***

0.056***

(0.007)

(0.012)

Δ FDI (t-1)

0.017

0.016

(0.012)

(0.019)

Post-2008

-0.034***

-0.028**

(0.007)

(0.012)

Δ FDI (t-1) × Post

-0.008

-0.005

(0.012)

(0.021)

Δ GCF

0.005**

0.001

(0.002)

(0.003)

Δ R&D

-0.272***

(0.054)

Δ HC

-0.297

(0.469)

Δ Trade

-0.003***

-0.002*

(0.001)

(0.001)

Num.Obs.

22

22

R2

0.809

0.502

F

10.585

2.517

* p < 0.1, ** p < 0.05, *** p < 0.01

До 2008 года коэффициент FDI с лагом 1 года положителен в обеих моделях, однако статистически незначим. После 2008 года сам уровень изменения TFP становится ниже: коэффициент Post-2008 отрицателен и значим в обеих спецификациях. При этом взаимодействие Δ FDI(t−1) x Post отрицательно, но статистически незначимо, поэтому формальных доказательств изменения именно эффекта FDI после 2008 года нет. Таким образом, структурный разрыв после 2008 года подтверждается прежде всего изменением общей динамики TFP, а не устойчивым изменением влияния FDI.