[英]R: Adding Footnote to table output
我,一個R初學者,創建了以下可重現的示例代碼,用於輸出各種變量的ADF測試的測試統計信息:
library(urca)
data(nporg)
df <- nporg[complete.cases(nporg), ]
table_adf = function(x) {
for (i in 1:x) { #something is wrong here
out1 <- ur.df(x, type = "drift", selectlags = "AIC")@teststat[1]
out2 <- ur.df(x, type = "trend", selectlags = "AIC")@teststat[1]
out <- c(out1,out2)
return(data.frame(matrix(out, nrow=1, dimnames=list(NULL, names(out)))))
}
footnote <- rep("", 3)
footnote[1] <- c("Lag length determined with the AIC information criteria.")
footnote[2] <- c(paste("ADF critical values drift:", out1@cval[[1]], out1@cval[[2]], out1@cval[[3]]))
footnote[3] <- c(paste("ADF critical values trend:", out2@cval[[2]], out2@cval[[2]], out2@cval[[3]]))
print(footnote) # something is wrong here, too
}
rbind(
table_adf(df$emp),
table_adf(df$cpi),
table_adf(df$sp)
)
我的問題: 如何打印表格下方的腳注,如果可能的話,還要將每個變量名稱添加到行中?
如果您在我的代碼中發現任何其他錯誤或效率低下,請給我一個提示。 謝謝。
更新:所需輸出:
==============================================
drift trend
----------------------------------------------
emp -0.259 -4.841 ***
cpi 0.488 -1.326
sp 0.232 -3.831 **
... ... ...
----------------------------------------------
ADF critical values drift: -3.51 -2.89 -2.58
ADF critical values trend: -4.04 -3.45 -3.15
我更改了趨勢中的數字,以便您可以看到重要性。
stargazer
具有出色的報告功能。 這是你可以做的事情,例如使用stargazer()
的notes=
腳注的參數:
library(urca)
library(stargazer)
library(dplyr)
data(nporg)
df <- nporg[complete.cases(nporg), ]
table_adf = function(DF, ...){
var_list = list(...)
select_(DF, .dots = var_list) %>%
{invisible(Map(function(x, y){
out1 = ur.df(x, type = "drift", selectlags = "AIC")
out2 = ur.df(x, type = "trend", selectlags = "AIC")
est_df = data.frame(drift = out1@teststat[1], trend = out2@teststat[1],
row.names = y)
footnote1 = paste("ADF critical values drift:", out1@cval[1,1], out1@cval[1,2], out1@cval[1,3])
footnote2 = paste("ADF critical values trend:", out2@cval[1,1], out2@cval[1,2], out2@cval[1,3])
stargazer(est_df, type = "text", summary = FALSE,
notes = c(footnote1, footnote2))
},. , var_list))}
}
table_adf(df, "emp", "cpi", "sp")
使用...
參數和select_
+ .dots
而不是select
以編程方式提供變量名稱
請注意,我已經更改了out1@cval
的索引以正確引用“tau”臨界值。 雖然我不熟悉ADF測試,但你用out1@cval[[1]]
索引2x3矩陣的方式對我來說似乎很奇怪。 所以我懷疑你真的想要那張桌子的第一行。
> out1@cval
1pct 5pct 10pct
tau2 -3.51 -2.89 -2.58
phi1 6.70 4.71 3.86
結果:
==============================================
drift trend
----------------------------------------------
emp -0.259 -3.041
----------------------------------------------
ADF critical values drift: -3.51 -2.89 -2.58
ADF critical values trend: -4.04 -3.45 -3.15
==============================================
drift trend
----------------------------------------------
cpi 0.488 -1.326
----------------------------------------------
ADF critical values drift: -3.51 -2.89 -2.58
ADF critical values trend: -4.04 -3.45 -3.15
==============================================
drift trend
----------------------------------------------
sp 0.232 -1.343
----------------------------------------------
ADF critical values drift: -3.51 -2.89 -2.58
ADF critical values trend: -4.04 -3.45 -3.15
現在,這需要更多參與,因為你必須...:
ur.df
對象中提取估計值( @teststate
) @cval
相比,查看每個估算值是否顯着 注意我在這個函數中使用了最少數量的管道運算符%>%
,因為幾乎每個步驟都被使用了不止一次。 舉例來說,我不能只是管...
參數到lapply
的tests
,因為我還需要變量列表設置row.names
在est_table
一步。
var_list = as.list(unlist(list(...)))
似乎不必要地復雜,但它是一種允許用戶輸入變量名稱c("emp", "cpi", "sp")
向量的方法c("emp", "cpi", "sp")
,個別變量名稱"emp", "cpi", "sp"
或兩者都是c("emp", "cpi"), "sp"
。 這為用戶創造了額外的便利。 最開始的ifelse
步驟檢查變量名稱是否有零參數,如果是這種情況則使用整個數據幀。
table_adf = function(DF, ...){
# Stores ... arguments as list
var_list = as.list(unlist(list(...)))
# Subset DF based on var_list
if(length(var_list) == 0){
subset = DF
var_list = as.list(names(DF))
}else{
subset = select_(DF, .dots = var_list)
}
# Run model for each variable, and stored as list of lists, each element of the
# outer list contains a list of the variable's drift and trend estimates
tests = lapply(subset, function(x, y){
out1 = ur.df(x, type = "drift", selectlags = "AIC")
out2 = ur.df(x, type = "trend", selectlags = "AIC")
return(list(out1, out2))
})
# Store each model estimates in to a dataframe with corresponding variable names
est_df = lapply(tests, function(x){
data.frame(drift = x[[1]]@teststat[1], trend = x[[2]]@teststat[1])
})
# Combine the list into a single dataframe
est_table = do.call(rbind, est_df)
critical_vals = data.frame(tests[[1]][[1]]@cval[1,],
tests[[1]][[2]]@cval[1,])
# Check for significance level and add *'s accordingly
est_table = Map(function(x, y){
ifelse(x < y[1], paste(x, "***"),
ifelse(x < y[2], paste(x, "**"),
ifelse(x < y[3], paste(x, "*"), x)))
}, est_table, critical_vals) %>% data.frame(row.names = unlist(var_list))
# Set footnotes
footnote1 = paste("ADF critical values drift:", paste(critical_vals[[1]], collapse = " "))
footnote2 = paste("ADF critical values trend:", paste(critical_vals[[2]], collapse = " "))
# Create nice looking table with critical values
stargazer(est_table, type = "text", summary = FALSE,
notes = c(footnote1, footnote2))
}
下面演示了用戶輸入變量名稱以獲得所需估計值的方法:
> table_adf(df, "emp", "cpi", "sp")
==============================================
drift trend
----------------------------------------------
emp -0.259 -3.041
cpi 0.488 -1.326
sp 0.232 -1.343
----------------------------------------------
ADF critical values drift: -3.51 -2.89 -2.58
ADF critical values trend: -4.04 -3.45 -3.15
> table_adf(df, names(df)[-1])
==============================================
drift trend
----------------------------------------------
gnp.r 1.22473721812295 -1.308
gnp.n 4.2258196600637 2.195
gnp.pc -0.153914521574277 -2.628
ip 1.49350460242673 -0.924
emp -0.258523412908067 -3.041
ur -2.75061777744267 * -2.777
gnp.p 1.06909915298064 -0.800
cpi 0.488243115715459 -1.326
wg.n 2.81042091873464 0.399
wg.r 0.399440467221402 -2.445
M 1.45354783780152 -0.454
vel -2.50304919304012 -2.537
bnd 1.21565390985417 1.837
sp 0.231913401411228 -1.343
----------------------------------------------
ADF critical values drift: -3.51 -2.89 -2.58
ADF critical values trend: -4.04 -3.45 -3.15
> table_adf(df)
==============================================
drift trend
----------------------------------------------
year -1.73205080756904 -1.732
gnp.r 1.22473721812295 -1.308
gnp.n 4.2258196600637 2.195
gnp.pc -0.153914521574277 -2.628
ip 1.49350460242673 -0.924
emp -0.258523412908067 -3.041
ur -2.75061777744267 * -2.777
gnp.p 1.06909915298064 -0.800
cpi 0.488243115715459 -1.326
wg.n 2.81042091873464 0.399
wg.r 0.399440467221402 -2.445
M 1.45354783780152 -0.454
vel -2.50304919304012 -2.537
bnd 1.21565390985417 1.837
sp 0.231913401411228 -1.343
----------------------------------------------
ADF critical values drift: -3.51 -2.89 -2.58
ADF critical values trend: -4.04 -3.45 -3.15
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.