R 如何按模型列表中的出现顺序对系数名称的字符向量重新排序
in R非常适合将多元回归模型显示为并排列,这是许多社会科学学科的标准样式。但是,这个包不能很好地使用knitr+pandoc,因为它生成的输出要么是HTML,要么是TeX,而不是Markdown 作为解决方案,我正在创建一个函数,该函数可以生成与stargazer创建的表类似的表,但它将输出保存为一个简单的数据帧,然后我可以在编织文档中使用类似于R 如何按模型列表中的出现顺序对系数名称的字符向量重新排序,r,sorting,stargazer,tidyverse,R,Sorting,Stargazer,Tidyverse,in R非常适合将多元回归模型显示为并排列,这是许多社会科学学科的标准样式。但是,这个包不能很好地使用knitr+pandoc,因为它生成的输出要么是HTML,要么是TeX,而不是Markdown 作为解决方案,我正在创建一个函数,该函数可以生成与stargazer创建的表类似的表,但它将输出保存为一个简单的数据帧,然后我可以在编织文档中使用类似于kable和pander的包进行渲染。对于像broom::tidy这样的函数,这样做很简单 然而,我被困在如何对模型中显示的系数排序上。以这三种模式为
kable
和pander
的包进行渲染。对于像broom::tidy
这样的函数,这样做很简单
然而,我被困在如何对模型中显示的系数排序上。以这三种模式为例。使用stargazer显示时,最终系数顺序为c(“wt”、“qsec”、“hp”、“cyl”、“齿轮”、“carb”、“drat”)
。所有系数的顺序主要基于第一个模型中的系数(wt
,qsec
,cyl
,gear
,carb
)。当第二个模型作为新列追加时,hp
行插入在qsec
之后和cyl
之前
lm0回答OP的Q
那么,最后,我该如何按照模型列表中的出现顺序对系数名称的字符向量进行排序或重新排序,并对列表中第一个模型的顺序进行优先级排序
以下是一个适用于任意数量模型的一行程序:
unique(names(unlist(lapply(list(lm0, lm1, lm2), coef))))[-1]
#[1] "wt" "qsec" "cyl" "gear" "carb" "hp" "drat"
请注意,代码隐式假设第一个模型始终具有(Intercept)
作为第一个系数,该系数通过负索引[-1]
从结果向量中移除
如果不能保证这一点,那么使用它可能更安全
setdiff(unique(names(unlist(lapply(list(lm0, lm1, lm2), coef)))), "(Intercept)")
从结果向量中删除(截取)
(如果有)且不考虑其位置。其余系数名称将保持其顺序:
#[1] "wt" "qsec" "cyl" "gear" "carb" "hp" "drat"
编辑
目前还不清楚是哪个逻辑stargazer
实现了对系数进行排序。但是,根据帮助页面,stargazer
也以不可见的方式返回与字符向量相同的输出。此外,table.layout
参数只能用于返回系数部分。这可用于按与stargazer
相同的顺序提取系数名称:
sgt <- capture.output(stargazer::stargazer(lm0, lm1, lm2, type="text", table.layout = "t"))
setdiff(stringr::str_extract(sgt, "^\\w*"), c("", "Constant"))
#[1] "wt" "qsec" "hp" "cyl" "gear" "carb" "drat"
中士哦,我喜欢这个简单。它缺少的一点是hp
在qsec
和cyl
之间的位置,就像在stargazer中一样,所需的输出将hp
放在前面,因为它是一个新变量,但它出现在现有变量之前,如cyl
和gear
@Andrew通过直接从stargazer
output.Awesome提取系数名称找到了另一种解决方案。我曾尝试重新创建stargazer的原始逻辑,但它的代码包含200行嵌套循环,几乎难以理解。依靠stargazer来完成繁重的工作要容易得多,特别是在限制输出的情况下。另外,将其全部封装在捕获输出()中可以保持控制台输出的干净,因为stargazer会自动cat()
s输出:capture.output({sgt