以下脚本用于打印具有单位根测试结果的表。您可以自己尝试代码。
library(vars)
Canada = data.frame(Canada)
library(urca)
library(stargazer)
library(dplyr)
table_adf = function(DF, ...){
var_list = as.list(unlist(list(...)))
if(length(var_list) == 0){
subset = DF
var_list = as.list(names(DF))
}else{
subset = select_(DF, .dots = var_list)
}
tests = lapply(subset, function(x, y){
out1 = ur.df(x, type = "drift", selectlags = "BIC")
out2 = ur.df(x, type = "trend", selectlags = "BIC")
out3 = ur.pp(x, type = "Z-tau", model = "const", lags = "short")
out4 = ur.pp(x, type = "Z-tau", model = "trend", lags = "short")
out5 = ur.kpss(x, type = "mu", lags = "short")
out6 = ur.kpss(x, type = "tau", lags = "short")
return(list(out1, out2, out3, out4, out5, out6))
})
est_df = lapply(tests, function(x){
data.frame(ADF_constant = x[[1]]@teststat[1],
ADF_trend = x[[2]]@teststat[1],
PP_const = x[[3]]@teststat[1],
PP_trend = x[[4]]@teststat[1],
KPSS_const = x[[5]]@teststat[1],
KPSS_trend = x[[6]]@teststat[1])
})
est_table = do.call(rbind, est_df)
est_table = round(est_table, 2)
critical_vals = data.frame(tests[[1]][[1]]@cval[1,],
tests[[1]][[2]]@cval[1,],
tests[[1]][[3]]@cval[1,],
tests[[1]][[4]]@cval[1,],
tests[[1]][[5]]@cval[1,-1],
tests[[1]][[6]]@cval[1,-1])
est_table[, 1:4] = Map(function(x, y){
ifelse(x < y[1], paste(x, "0.01"),
ifelse(x < y[2], paste(x, "0.05"),
ifelse(x < y[3], paste(x, "0.10"), paste(x, ""))))
}, est_table[, 1:4], critical_vals[, 1:4]) %>% data.frame(row.names = unlist(var_list))
est_table[, 5:6] = Map(function(x, y){
ifelse(x > y[3], paste(x, "0.01"),
ifelse(x > y[2], paste(x, "0.02"),
ifelse(x > y[1], paste(x, "0.05"), paste(x, ""))))
}, est_table[, 5:6], critical_vals[, 5:6]) %>% data.frame(row.names = unlist(var_list))
stargazer(est_table, type = "text", summary = FALSE)
}
table_adf(Canada, "e", "prod", "rw", "U")
输出表:
=====================================================================
ADF_constant ADF_trend PP_const PP_trend KPSS_const KPSS_trend
---------------------------------------------------------------------
e -0.3 -2.73 0.15 -1.62 2.05 0.01 0.17 0.05
prod -0.11 -2.02 0.26 -1.97 1.66 0.01 0.27 0.01
rw -4.37 0.01 -2.82 -5.62 0.01 -2.81 2.12 0.01 0.43 0.01
U -2.22 -2.47 -1.72 -1.96 0.23 0.14
---------------------------------------------------------------------
正如您在示例中看到的,第一个值显示为-0.3
而不是-0.30
。如何调整脚本,以便将每个测试结果打印为带小数点后两位的数字?
答案 0 :(得分:3)
一个建议是定义一个新的paste
函数。 E.g
pasteFix <- function(x, signLev){
ifelse(nchar(as.character(abs(x)))<4,
paste(paste(x, "0", sep=""),signLev),
paste(x, signLev))
}
(nchar<4
代表逗号。abs()
删除-
)。
然后替换paste
Map
功能
est_table[, 1:4] = Map(function(x, y){
ifelse(x < y[1], pasteFix(x, "0.01"),
ifelse(x < y[2], pasteFix(x, "0.05"),
ifelse(x < y[3], pasteFix(x, "0.10"), pasteFix(x, ""))))
}, est_table[, 1:4], critical_vals[, 1:4]) %>% data.frame(row.names =
unlist(var_list))
est_table[, 5:6] = Map(function(x, y){
ifelse(x > y[3], pasteFix(x, "0.01"),
ifelse(x > y[2], pasteFix(x, "0.02"),
ifelse(x > y[1], pasteFix(x, "0.05"), pasteFix(x, ""))))
}, est_table[, 5:6], critical_vals[, 5:6]) %>% data.frame(row.names =
unlist(var_list))
然后输出
=====================================================================
ADF_constant ADF_trend PP_const PP_trend KPSS_const KPSS_trend
---------------------------------------------------------------------
e -0.30 -2.73 0.15 -1.62 2.05 0.01 0.17 0.05
prod -0.11 -2.02 0.26 -1.97 1.66 0.01 0.27 0.01
rw -4.37 0.01 -2.82 -5.62 0.01 -2.81 2.12 0.01 0.43 0.01
U -2.22 -2.47 -1.72 -1.96 0.23 0.14
---------------------------------------------------------------------