如何发布(Sweave)回归公式?

7
如何以漂亮的方式发布回归公式?
fit1<-dynlm(dep~indep1+indep2+indep3)
s1<-summary(fit1)
s1$call

我该如何编织s1$call?我的意思是,我不想在我的PDF文档中出现像“dynlm(公式=dep~indep1+indep2+indep3)”这样的内容。我更喜欢函数调用风格以外的教科书风格。此外,我想手动添加截距和误差项到模型中(因为它实际上就在里面)。请注意,我在谷歌上发现了outreg (似乎有点太重量级),并且乍一看似乎并不符合我的需求。

编辑:试图发布示例输出,实际上我很愿意,但我不知道如何在SO编辑器中更好地完成:

 dep = alpha + beta_1*indep1 + beta_2*indep2 + beta_3*indep3 + epsilon

一些矩阵符号也可以,但无论如何打印模型定义都很好。当然,手动添加也是可能的,但在稳健性检查阶段,模型变量可能经常变化,文档必须保持最新。(使用http://texify.com :)

img]http://www.texify.com/img/%5CLARGE%5C%21%5Cmbox%7Bdep%7D%20%3D%20%5Calpha%20%2B%20%5Cbeta_1%20%5Ccdot%20%5Cmbox%7Bindep1%7D%20%2B%20%5Cbeta_2%20%5Ccdot%20%5Cmbox%7Bindep2%7D%20%2B%20%5Cepsilon.gif[/img


我不知道有任何现成的解决方案。我建议使用适当的翻译器(使用 pastegsub 等等 -- 要小心必要时转义反斜杠!),创建你想要的 LaTeX 字符串,然后在相关块的 Sweave 选项中使用 results=tex,这样就可以了(我不知道是否可以在 \Sexpr 表达式中获得相当于 results=tex 的等价物...)。 - Ben Bolker
PS \Sexpr 的结果是逐字包含的,所以我的关于 results=tex 的评论是无关紧要的。这可能会有用:https://dev59.com/xW035IYBdhLWcg3wc_wm - Ben Bolker
我有点困惑,因为似乎没有现成的解决方案。可能需要自己动手解决,但感谢大家的回答,特别是 pastin 和 gsubbing,这应该是可行的。最终很难接受一个答案 :) - Matt Bannert
你想要的输出并不是完全清楚的。能否提供样例输出? - Ben Bolker
谢谢Ben!我讨厌不得不在这里写这些胡言乱语只是为了说谢谢Ben,因为SO需要更多的字符 :) - Matt Bannert
3个回答

5

这个Rnw文件:

\documentclass{article}
\begin{document}
<<>>=
data("USDistLag", package = "lmtest")
library(dynlm)
dfm1 <- dynlm(consumption ~ gnp + L(consumption), data = USDistLag)
@ 

<<echo=FALSE>>=
cc <-dfm1$call
f <- cc$formula
LHS <- as.character(f)[2]
RHS <- as.character(f)[3]
coefs <- gsub(" +","",strsplit(RHS,"\\+")[[1]])
mbox <- function(x) { paste("\\\\mbox{",x,"}",sep="") }
pars <- paste("\\\\beta_",0:(length(coefs)-1),sep="")
p <- paste(mbox(LHS),"=",paste(pars,mbox(coefs),sep=" \\\\cdot ",collapse="+"),
           "+ \\\\epsilon")
@ 

$$
\Sexpr{p}
$$
\end{document}

导致这个 TeX 片段:
\documentclass{article}
\begin{document}
\begin{Schunk}
\begin{Sinput}
> data("USDistLag", package = "lmtest")
> library(dynlm)
> dfm1 <- dynlm(consumption ~ gnp + L(consumption), data = USDistLag)
\end{Sinput}
\end{Schunk}


$$
\mbox{consumption} = \beta_0 \cdot \mbox{gnp}+\beta_1 \cdot \mbox{L(consumption)} + \epsilon
$$
\end{document}

当我运行该代码时,我得到以下的TeX片段:$$ \Sexpr{\\\\mbox{消费} = \\\\beta_0 \\\\cdot \\\\mbox{国民生产总值}+\\\\beta_1 \\\\cdot \\\\mbox{L(消费)} + \\\\epsilon} $$ - Zach
你是怎么运行的?对我来说可以——我将文本复制到一个文件“Sweavetmp.Rnw”中,并尝试了两种方式(从命令行)R CMD Sweave Sweavetmp.Rnw和(从R提示符)Sweave("Sweavetmp.Rnw")。得到了一个带有单个反斜杠的合理的“Sweavetmp.tex”文件,可以完美地进行pdflatex - Ben Bolker
@ Ben Bolker:我正在使用Rstudio中的“编译PDF”选项,我认为这可能是导致问题的原因。 - Zach
1
也许你可以在Rstudio帮助论坛http://support.rstudio.org/上提问。开发人员通常会非常及时地回复... - Ben Bolker

3
我在学习回归模型的入门课程时写了这个函数。虽然它可能不是最佳选择,但对于那门课程来说已经足够好了。如果没有其他更好的选择,也许这个函数可以帮助你朝着正确的方向继续前进。
writeCoef <- function(x) {
  require(plyr)

    coefnames <- as.data.frame(coef(x))
    coefnames$betas <- row.names(coefnames) 
    coefnames <- adply(coefnames, 1, function(x) paste(round(x[1],3), x[2] , sep = " * "))

    dependent <- paste(as.character(x$call$formula)[2], " = ", sep = "")

    ret <- paste(dependent, paste(coefnames[,3], sep = "", collapse = " + "))
    ret <- gsub("\\*\\s\\(Intercept\\)", "", ret)
  return(ret)
    }

实际应用中:

ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
group <- gl(2,10,20, labels=c("Ctl","Trt"))
weight <- c(ctl, trt)
lm.D9 <- lm(weight ~ group)

> writeCoef(lm.D9)
[1] "weight =  5.032 + -0.371 * groupTrt"

这很不错,但是它听起来不像 OP 想要的东西——即回归的理论公式,而不是估计系数等。 - Ben Bolker

0
这个简短的Rnw文件演示了如何打印一个长的回归公式,并将其分多行显示:
\documentclass{article}
\usepackage{breqn}
\begin{document}
\SweaveOpts{concordance=TRUE}

<<Printmodel,echo=FALSE,results=tex>>=
#Specify any formula
model1 <- formula("outcome ~ (variable1 +variable2 + variable3 + variable4 + variable5 + variable6 )^2 + variable7 + variable8 + variable7 * variable8")

#Converts formula to LaTeX
cat(paste("\\begin{dmath*}\n",gsub("~","\\\\sim",deparse(model1,width.cutoff = 500L)),"\n\\end{dmath*}",sep=""))
@

\end{document}

生成的LaTeX代码为:

\begin{dmath*}
outcome \sim (variable1 + variable2 + variable3 + variable4 + variable5 + variable6)^2 + variable7 + variable8 + variable7 * variable8
\end{dmath*}

通过使用breqn包和dmath环境,可以很好地跨多行包装。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接