【问题标题】:How to publish (sweave) regression formulas?如何发布(摆动)回归公式?
【发布时间】:2011-09-16 18:16:52
【问题描述】:

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

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

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

请注意,我在 google 上找到了outreg(现在看起来有点过于沉重了),乍一看并不完全符合我的需求。

编辑:尝试发布示例输出,实际上我很乐意,但我不知道如何使用 SO 编辑器做得更好:

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

一些矩阵符号也可以,但是无论如何打印模型定义都会很好。当然手动添加也是可能的,但是当您处于稳健性检查阶段时,模型变量可能会经常更改,并且文档必须是最新的。

(使用http://texify.com :)

【问题讨论】:

  • 我不知道任何罐装解决方案。我建议组装一个合适的翻译器(使用pastegsub 等——在必要时小心转义反斜杠!),创建你想要的 LaTeX 字符串,然后在你的 Sweave 选项中使用results=tex相关块(我不知道您是否可以在 \Sexpr 表达式中获得等效的 results=tex ...)
  • PS \Sexpr 结果是逐字包含的,所以我对results=tex 的评论是无关紧要的。这可能有用:stackoverflow.com/questions/5406071/…
  • 我有点困惑,没有什么是开箱即用的。可能必须自己做一些事情,但感谢您的所有回答,尤其是粘贴和 gsubbing,它应该是可以管理的。最终很难接受一个答案:)
  • 实际上并不完全清楚你想要什么输出。你能发布示例输出吗?
  • 谢谢本!我讨厌我必须在这里写这些乱七八糟的东西只是为了感谢 Ben,因为 SO 需要更多字符 :)

标签: r publish regression sweave


【解决方案1】:

这个简短的 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 环境,可以很好地包裹多行。

【讨论】:

    【解决方案2】:

    这个 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{consumption} = \\\\beta_0 \\\\cdot \\\\mbox{gnp}+\\\\beta_1 \\\\cdot \\\\mbox{L(consumption)} + \\\\epsilon} $$
    • 你是如何运行它的?对我有用——我将文本复制到文件Sweavetmp.Rnw 并尝试了(从命令行)R CMD Sweave Sweavetmp.Rnw 和(从 R 提示符)Sweave("Sweavetmp.Rnw")。得到一个带有单个反斜杠的合理的 Sweavetmp.tex 文件,这可能是 pdflatexed 就好了。
    • @Ben Bolker:我在 Rstudio 中使用“编译 pdf”选项,我认为这是导致问题的原因。
    • 也许你可以在support.rstudio.org 的 Rstudio 帮助论坛上提问。开发人员通常反应灵敏...
    【解决方案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 想要的——即回归的理论公式,而不是估计的系数等等
    猜你喜欢
    • 1970-01-01
    • 2013-07-01
    • 2015-01-05
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2016-08-07
    • 2014-06-27
    • 2016-02-17
    相关资源
    最近更新 更多