7

我怎样才能很好地发布回归公式?

fit1<-dynlm(dep~indep1+indep2+indep3)
s1<-summary(fit1)
s1$call

我该如何编织s1$call?我的意思是我不想在我的 pdf 文档中出现类似 `dynlm(formula=dep~indep1+indep2+indep3)´ 的内容。与这种函数调用风格相比,我更喜欢教科书风格。另外,我想(手动?)在模型中添加拦截和错误项(因为它实际上就在那里)。

请注意,我outreg在 google 上发现(现在似乎有点过于沉重),乍一看并不完全符合我的需求。

编辑:尝试发布示例输出,实际上我很乐意,但我不知道如何使用 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

4

3 回答 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}
于 2011-06-17T02:13:07.347 回答
3

I found this function I wrote when I was taking an intro class to regression modeling. I'm sure it's less than optimal, but it worked well enough for that course. If nothing else, maybe this will get you pointed in the right direction to take it further.

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)
    }

And in action:

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"
于 2011-06-16T22:50:57.503 回答
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 环境,它很好地包裹了多行。

于 2016-05-06T15:16:44.470 回答