簡體   English   中英

R:向表輸出添加腳注

[英]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  

單表具有所有變量估計顯着性指標

現在,這需要更多參與,因為你必須...:

  1. 從每個ur.df對象中提取估計值( @teststate
  2. @cval相比,查看每個估算值是否顯着
  3. 將所有估算值放在同一個表格中

注意我在這個函數中使用了最少數量的管道運算符%>% ,因為幾乎每個步驟都被使用了不止一次。 舉例來說,我不能只是管...參數到lapplytests ,因為我還需要變量列表設置row.namesest_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM