我想在R中运行一系列lme4
模型,了解不同子集中的不同结果(每个模型运行在一个意向待遇(ITT)和每个协议(PP)子集上,我有不同的结果)我使用texreg()
打印LaTeX表来比较结果并在knitr
文档中打印得很好。
由于我要运行许多微妙的不同模型,我认为明智的做法是将我的模型和texreg()
调用变成一个函数,为此我写了...... < / p>
pleasant.regression <- function(data = proportion,
time.frame = "September 2013",
outcome = "unscheduled",
family = binomial,
caption = "ITT and PP Linear Mixed Effects Model Coefficients and Standard Errors for \\emph{any} Unscheduled Visits in September 2013.",
label = "logistic-unscheduled",
...){
## Require packages
require(lme4)
require(ResourceSelection)
require(texreg)
## Set defaults for texreg tables, can be modified with additional arguments
texreg.digits <- 2
texreg.table <- TRUE
texreg.caption.above <- TRUE
texreg.booktabs <- TRUE
texreg.dcolumn <- TRUE
texreg.use.packages <- FALSE
texreg.float.pos <- "!htpb"
texreg.ci.force <- TRUE
texreg.ci.test <- 0
## Parse the outcome into a formula with the desired mixed
## effects model
.formula <- reformulate(response = outcome, termlabels = c("allocation", "gender", "age", "n.unscheduled.2012", "(1 | pracid)"))
## Logistic Regresion
if(family == "binomial"){
## ITT
itt.mixed <- lmer(.formula,
data = subset(data,
period == time.frame & age.include == TRUE),
family = family)
## PP
pp.mixed <- lmer(.formula,
data = subset(data,
period == time.frame & age.include == TRUE & pp == 1),
family = family)
}
## Negative Binomial
else if(family == "negbin"){
## ITT
itt.mixed <- glmer.nb(.formula,
data = subset(data,
period == time.frame & age.include == TRUE))
## PP
pp.mixed <- glmer.nb(.formula,
data = subset(data,
period == time.frame & age.include == TRUE & pp == 1))
}
## Save table comparing ITT to PP using texreg()
results <- invisible(texreg(list(itt.mixed, pp.mixed),
custom.model.names = c("ITT", "PP"),
custom.coef.names = c("Intercept", "Allocation (Letter)", "Gender (Female)", "Age", "$N_{Unscheduled}$ September 2012"),
digits = texreg.digits,
caption = caption,
table = texreg.table,
caption.above = texreg.caption.above,
label = label,
booktabs = texreg.booktabs,
dcolumn = texreg.dcolumn,
use.packages = texreg.use.packages,
float.pos = texreg.float.pos,
ci.force = texreg.ci.force,
ci.test = texreg.ci.test))
return(results)
}
当我调用它时虽然texreg()打印出函数内的结果,但是没有将表作为打印对象返回...
> my.results <- pleasant.regression(data = proportion,
time.frame = "September 2013",
outcome = "unscheduled",
family = "binomial",
caption = "ITT and PP Linear Mixed Effects Model Coefficients and Standard Errors for \\emph{any} Unscheduled Visits in September 2013.",
label = "logistic-unscheduled") ## Not expecting any output
Computing profile confidence intervals ...
Confidence intervals not available for this model. Using naive p values instead.
Computing profile confidence intervals ...
Confidence intervals not available for this model. Using naive p values instead.
\begin{table}[!htpb]
\caption{ITT and PP Linear Mixed Effects Model Coefficients and Standard Errors for \emph{any} Unscheduled Visits in September 2013. \textbf{NB} P-values are not explicitly calculated in favour of 95\% confidence intervals}
\begin{center}
\begin{tabular}{l D{.}{.}{5.11}@{} D{.}{.}{5.11}@{} }
\toprule
& \multicolumn{1}{c}{ITT} & \multicolumn{1}{c}{PP} \\
\midrule
Intercept & -0.73^{*} & -0.71^{*} \\
& [-0.95;\ -0.51] & [-0.95;\ -0.47] \\
Allocation (Letter) & -0.11 & -0.12 \\
& [-0.33;\ 0.12] & [-0.36;\ 0.12] \\
Gender (Female) & 0.06 & 0.06 \\
& [-0.03;\ 0.15] & [-0.03;\ 0.16] \\
Age & -0.01 & -0.01 \\
& [-0.03;\ 0.00] & [-0.03;\ 0.00] \\
$N_{Unscheduled}$ September 2012 & 1.18^{*} & 1.15^{*} \\
& [1.12;\ 1.25] & [1.08;\ 1.22] \\
\midrule
AIC & 12828.97 & 11597.78 \\
BIC & 12873.10 & 11641.29 \\
Log Likelihood & -6408.49 & -5792.89 \\
Deviance & 12816.97 & 11585.78 \\
Num. obs. & 11547 & 10415 \\
Number of Practices & 142 & 136 \\
Variance : Practice & 0.37 & 0.40 \\
Variance : Residual & 1.00 & 1.00 \\
\bottomrule
\multicolumn{3}{l}{\scriptsize{$^*$ 0 outside the confidence interval}}
\end{tabular}
\label{logistic-unscheduled}
\end{center}
\end{table}
> print(my.results) ## Would expect this to hold the above table and print it again
NULL
我尝试根据StackOverflow主题here将texreg()
调用封装在invisible()
中,这样就不会打印结果并返回但是并没有似乎按我的预期工作了。
我希望我错过了一些明显但无法解决的问题,我会非常感激地收到任何指示/建议。
答案 0 :(得分:3)
无论出于何种原因,如果您没有为输出提供文件名,texreg()
函数会选择通过cat()
将结果直接打印到屏幕上。这并不是R中大多数函数的工作原理,但是对于用户提交的包,包作者可以做任何他们喜欢的事情。
因此技术上默认情况下texreg()
不返回任何内容。您可以通过设置return.string=TRUE
让它返回一个字符串,但它仍然会打印到屏幕上。阻止自动打印的最简单方法是使用capture.output()
打包调用。这将抑制屏幕输出并将结果转换为带有每行输出条目的字符向量。因此,您可以将函数的结尾更改为
results <- paste(capture.output(texreg(... rest of code ...)), collapse="\n")
return(results)
应返回您期望的字符值,而不是打印到屏幕上。