通过函数将回归对象附加到列表
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
假设我正在尝试自动创建许多回归模型,如下所示:
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