bayesglm 的回归 table?
Regression table for bayesglm?
stargazer
is a great tool to generate a regression table if you are not using bayesglm
。例如,假设我有以下数据:
library(dplyr)
set.seed(9782)
N<-1000
df1 <- data.frame(v1=sample(c(0,1),N,replace = T),
v2=sample(c(0,1),N,replace = T),
Treatment=sample(c("A", "B", "C"), N, replace = T),
noise=rnorm(N)) %>%
mutate(Y=0.5*v1-0.7*v2+2*I(Treatment=="B")+3*I(Treatment=="C")+noise)
我可以 运行 lm
然后为我的 r markdown 创建 html (或文本)输出:
lm(data = df1, formula = Y~Treatment+v1+v2) %>%
stargazer::stargazer(type="html", style = "qje")
有没有办法为 bayesglm
做类似的事情?在这种情况下,pointEstimate
具有系数,standardError
具有标准误差
library(arm)
fit <- bayesglm(data = df1, formula = Y~Treatment+v1+v2)
posteriorDraws <- coef(sim(fit, n.sims=5000))
pointEstimate <- colMeans(posteriorDraws)
standardError <- apply(posteriorDraws, 2, sd)
看起来像这样就可以了:
library(texreg)
htmlreg(fit)
对于文本:
screenreg(list(fit))
正如@rawr 在评论中指出的那样,stargazer
是——虽然有用——但不幸的是,它是以一种相当单一、难以扩展的风格编写的。 broom package 是 (IMO) 一个设计精美的 modular/object-oriented 框架,用于从大量模型类型中提取摘要信息,但它并不面向生成 textual/tabular 摘要。对于那些喜欢那种东西的人来说,如果 stargazer
前端可以嫁接到 broom
后端上就好了,但那将是 lot 工作的。与此同时,除了破解内部 stargazer:::.stargazer.wrap
函数之外,这种方法(欺骗 stargazer
相信 fit
实际上是一个 lm()
模型) 有点像 作品:
class(fit) <- c("glm","lm")
fit$call[1] <- quote(lm())
stargazer(fit)
它显示了 fit
对象中内置的系数和标准误差,而不是后验绘制的输出,但在这个例子中至少这些答案非常相似。
如果您对降价没问题,那么 generic pander
S3 method 通常会做得很好:
> pander(fit, round = 4)
--------------------------------------------------------------
Estimate Std. Error t value Pr(>|t|)
----------------- ---------- ------------ --------- ----------
**(Intercept)** 0.0864 0.0763 1.131 0.2581
**TreatmentB** 1.951 0.0826 23.62 0
**TreatmentC** 3.007 0.0802 37.49 0
**v1** 0.4555 0.0659 6.915 0
**v2** -0.6845 0.0659 -10.39 0
--------------------------------------------------------------
Table: Fitting generalized (gaussian/identity) linear model: Y ~ Treatment + v1 + v2
请注意,我在这个例子中强制对数字进行四舍五入,因为一些 P 值非常低,所以默认的 digits
和其他 global options 会导致非常宽的 table。但是还有一些您可能想要使用的其他参数,例如:
> pander(summary(fit), round = 4, add.significance.stars = TRUE, move.intercept = TRUE, summary = TRUE, split.cells = Inf)
----------------------------------------------------------------------
Estimate Std. Error t value Pr(>|t|)
----------------- ---------- ------------ --------- ---------- -------
**TreatmentB** 1.951 0.0826 23.62 0 * * *
**TreatmentC** 3.007 0.0802 37.49 0 * * *
**v1** 0.4555 0.0659 6.915 0 * * *
**v2** -0.6845 0.0659 -10.39 0 * * *
**(Intercept)** 0.0864 0.0763 1.131 0.2581
----------------------------------------------------------------------
(Dispersion parameter for gaussian family taken to be 1.083267 )
-------------------- -----------------------------------
Null deviance: 2803 on 999 degrees of freedom
Residual deviance: 1078 on 995 degrees of freedom
-------------------- -----------------------------------
stargazer
is a great tool to generate a regression table if you are not using bayesglm
。例如,假设我有以下数据:
library(dplyr)
set.seed(9782)
N<-1000
df1 <- data.frame(v1=sample(c(0,1),N,replace = T),
v2=sample(c(0,1),N,replace = T),
Treatment=sample(c("A", "B", "C"), N, replace = T),
noise=rnorm(N)) %>%
mutate(Y=0.5*v1-0.7*v2+2*I(Treatment=="B")+3*I(Treatment=="C")+noise)
我可以 运行 lm
然后为我的 r markdown 创建 html (或文本)输出:
lm(data = df1, formula = Y~Treatment+v1+v2) %>%
stargazer::stargazer(type="html", style = "qje")
有没有办法为 bayesglm
做类似的事情?在这种情况下,pointEstimate
具有系数,standardError
具有标准误差
library(arm)
fit <- bayesglm(data = df1, formula = Y~Treatment+v1+v2)
posteriorDraws <- coef(sim(fit, n.sims=5000))
pointEstimate <- colMeans(posteriorDraws)
standardError <- apply(posteriorDraws, 2, sd)
看起来像这样就可以了:
library(texreg)
htmlreg(fit)
对于文本:
screenreg(list(fit))
正如@rawr 在评论中指出的那样,stargazer
是——虽然有用——但不幸的是,它是以一种相当单一、难以扩展的风格编写的。 broom package 是 (IMO) 一个设计精美的 modular/object-oriented 框架,用于从大量模型类型中提取摘要信息,但它并不面向生成 textual/tabular 摘要。对于那些喜欢那种东西的人来说,如果 stargazer
前端可以嫁接到 broom
后端上就好了,但那将是 lot 工作的。与此同时,除了破解内部 stargazer:::.stargazer.wrap
函数之外,这种方法(欺骗 stargazer
相信 fit
实际上是一个 lm()
模型) 有点像 作品:
class(fit) <- c("glm","lm")
fit$call[1] <- quote(lm())
stargazer(fit)
它显示了 fit
对象中内置的系数和标准误差,而不是后验绘制的输出,但在这个例子中至少这些答案非常相似。
如果您对降价没问题,那么 generic pander
S3 method 通常会做得很好:
> pander(fit, round = 4)
--------------------------------------------------------------
Estimate Std. Error t value Pr(>|t|)
----------------- ---------- ------------ --------- ----------
**(Intercept)** 0.0864 0.0763 1.131 0.2581
**TreatmentB** 1.951 0.0826 23.62 0
**TreatmentC** 3.007 0.0802 37.49 0
**v1** 0.4555 0.0659 6.915 0
**v2** -0.6845 0.0659 -10.39 0
--------------------------------------------------------------
Table: Fitting generalized (gaussian/identity) linear model: Y ~ Treatment + v1 + v2
请注意,我在这个例子中强制对数字进行四舍五入,因为一些 P 值非常低,所以默认的 digits
和其他 global options 会导致非常宽的 table。但是还有一些您可能想要使用的其他参数,例如:
> pander(summary(fit), round = 4, add.significance.stars = TRUE, move.intercept = TRUE, summary = TRUE, split.cells = Inf)
----------------------------------------------------------------------
Estimate Std. Error t value Pr(>|t|)
----------------- ---------- ------------ --------- ---------- -------
**TreatmentB** 1.951 0.0826 23.62 0 * * *
**TreatmentC** 3.007 0.0802 37.49 0 * * *
**v1** 0.4555 0.0659 6.915 0 * * *
**v2** -0.6845 0.0659 -10.39 0 * * *
**(Intercept)** 0.0864 0.0763 1.131 0.2581
----------------------------------------------------------------------
(Dispersion parameter for gaussian family taken to be 1.083267 )
-------------------- -----------------------------------
Null deviance: 2803 on 999 degrees of freedom
Residual deviance: 1078 on 995 degrees of freedom
-------------------- -----------------------------------