【问题标题】:Appending regression objects to a list via a function通过函数将回归对象附加到列表
【发布时间】:2020-07-19 00:02:24
【问题描述】:

假设我正在尝试自动创建许多回归模型,如下所示:

library(stargazer) 

get_main_effect_models <- function(data, outcome_vars){
  temp_list = list()
  i <- 0
  for(dv in outcome_vars) {
    temp_model <- lm(as.formula(paste(dv, "~ iv")),
                     data = data)
    
    temp_list = append(temp_list, temp_model)
  }
  return(temp_list)
}


dvs <- list('a', 'b')
fake_data = data.frame(a = rnorm(n = 100), b = rnorm(n = 100), iv = rnorm(n = 100))
summary_table = get_main_effect_models(fake_data, dvs)
stargazer(summary_table)

list.of.objects[[i]] 中的错误:下标超出范围

生成的 summary_table 不是对象列表。这是模型的字符表示的大列表。如何将实际回归模型存储在列表中以供观星者使用?

【问题讨论】:

  • 您应该在使用随机数据进行演示的问题中包含set.seed
  • 当您有多个结果变量但相同的预测变量时,您可以使用lm(as.matrix(data[,outcome_vars]) ~ iv, data) 拟合它们,从而避免显式循环。

标签: r stargazer


【解决方案1】:

一种解决方案是定义您的函数以创建一个回归,然后使用 lapply 对其进行迭代:

get_main_effect_models <- function(outcome_var, data) {
  lm(as.formula(paste(outcome_var, "~ iv")), data = data)
}

dvs <- list("a", "b")
fake_data <-  data.frame(a = rnorm(n = 100), b = rnorm(n = 100), iv = rnorm(n = 100))

summary_table <- lapply(dvs, get_main_effect_models, data = fake_data)   

stargazer(summary_table, type = "text") 
#==========================================================
#                                  Dependent variable:     
#                              ----------------------------
#                               paste(outcome_var, "~ iv") 
#                                    (1)           (2)     
#----------------------------------------------------------
#iv                                -0.004         0.006    
#                                  (0.110)       (0.099)   
#                                                          
#Constant                           0.075         -0.081   
#                                  (0.106)       (0.096)   
#                                                          
#----------------------------------------------------------
#Observations                        100           100     
#R2                                0.00001       0.00004   
#Adjusted R2                       -0.010         -0.010   
#Residual Std. Error (df = 98)      1.053         0.948    
#F Statistic (df = 1; 98)           0.001         0.004    
#==========================================================
#Note:                          *p<0.1; **p<0.05; ***p<0.01

【讨论】:

    【解决方案2】:

    我稍微修改了你的代码:

    get_main_effect_models <- function(data, outcome_vars){
      temp_list = vector(length = length(outcome_vars), mode="list")
      for(i in seq_along(outcome_vars)) {
        dv <- outcome_vars[[i]]
        temp_model <- lm(as.formula(paste(dv, "~ iv")),
                         data = data)
        
        temp_list[[i]] <- temp_model
      }
      return(temp_list)
    }
    

    我们的想法是创建一个设定长度的列表,并在我们检查变量时填充它。

    观星者输出

    % Table created by stargazer v.5.2.2 by Marek Hlavac, Harvard University. E-mail: hlavac at fas.harvard.edu
    % Date and time: Sat, Jul 18, 2020 - 08:25:34 PM
    \begin{table}[!htbp] \centering 
      \caption{} 
      \label{} 
    \begin{tabular}{@{\extracolsep{5pt}}lcc} 
    \\[-1.8ex]\hline 
    \hline \\[-1.8ex] 
     & \multicolumn{2}{c}{\textit{Dependent variable:}} \\ 
    \cline{2-3} 
    \\[-1.8ex] & \multicolumn{2}{c}{paste(dv, "\textasciitilde iv")} \\ 
    \\[-1.8ex] & (1) & (2)\\ 
    \hline \\[-1.8ex] 
     iv & $-$0.051 & 0.005 \\ 
      & (0.107) & (0.106) \\ 
      & & \\ 
     Constant & $-$0.029 & 0.111 \\ 
      & (0.099) & (0.099) \\ 
      & & \\ 
    \hline \\[-1.8ex] 
    Observations & 100 & 100 \\ 
    R$^{2}$ & 0.002 & 0.00003 \\ 
    Adjusted R$^{2}$ & $-$0.008 & $-$0.010 \\ 
    Residual Std. Error (df = 98) & 0.995 & 0.986 \\ 
    F Statistic (df = 1; 98) & 0.230 & 0.003 \\ 
    \hline 
    \hline \\[-1.8ex] 
    \textit{Note:}  & \multicolumn{2}{r}{$^{*}$p$<$0.1; $^{**}$p$<$0.05; $^{***}$p$<$0.01} \\ 
    \end{tabular} 
    \end{table} 
    

    【讨论】:

    • 啊,我明白了。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2020-12-19
    • 2021-12-20
    • 2017-01-16
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多