通过函数将回归对象附加到列表

Appending regression objects to a list via a function

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

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)

Error in list.of.objects[[i]] : subscript out of bounds

生成的 summary_table 不是对象列表。这是一个很大的模型字符表示列表。如何将实际回归模型存储在列表中以便在 stargazer 中使用?

我稍微修改了你的代码:

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 & $-[=11=].051 & 0.005 \ 
  & (0.107) & (0.106) \ 
  & & \ 
 Constant & $-[=11=].029 & 0.111 \ 
  & (0.099) & (0.099) \ 
  & & \ 
\hline \[-1.8ex] 
Observations & 100 & 100 \ 
R$^{2}$ & 0.002 & 0.00003 \ 
Adjusted R$^{2}$ & $-[=11=].008 & $-[=11=].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$<[=11=].1; $^{**}$p$<[=11=].05; $^{***}$p$<[=11=].01} \ 
\end{tabular} 
\end{table} 

一个解决方案是定义你的函数来创建一个回归,然后用 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