【问题标题】:how to get beautiful latex output of "nls" object如何获得漂亮的“nls”对象的乳胶输出
【发布时间】:2014-05-05 14:18:09
【问题描述】:

我需要“nls”对象的 LaTex 表示。不幸的是,stargazer 不支持这种对象类型。

网上的一些研究让我从 nls2 库中找到了 as.lm.nls 函数。它声称将 nls 对象转换为相应的 lm 对象。就我而言,它失败了。以下是示例输出:

> DNase1 <- subset(DNase, Run == 1)
> xx <- nls(density ~ SSlogis(log(conc), Asym, xmid, scal), DNase1)
> summary(xx)

Formula: density ~ SSlogis(log(conc), Asym, xmid, scal)

Parameters:
     Estimate Std. Error t value Pr(>|t|)    
Asym  2.34518    0.07815   30.01 2.17e-13 ***
xmid  1.48309    0.08135   18.23 1.22e-10 ***
scal  1.04146    0.03227   32.27 8.51e-14 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01919 on 13 degrees of freedom

Number of iterations to convergence: 0 
Achieved convergence tolerance: 3.281e-06

并且下面的 as.lm.nls 输出与上面的实际输出不匹配:

> library(nls2)
Loading required package: proto
> xlm = as.lm.nls(xx)
> summary(xlm)

Call:
lm(formula = density ~ Asym + xmid + scal - 1, offset = fitted(xx))

Residuals:
      Min        1Q    Median        3Q       Max 
-0.033513 -0.012931 -0.001454  0.009699  0.038137 

Coefficients:
       Estimate Std. Error t value Pr(>|t|)
Asym -8.878e-07  7.815e-02       0        1
xmid -9.328e-07  8.135e-02       0        1
scal -3.751e-07  3.227e-02       0        1

Residual standard error: 0.01919 on 13 degrees of freedom
Multiple R-squared:  0.9996,    Adjusted R-squared:  0.9995 
F-statistic: 1.153e+04 on 3 and 13 DF,  p-value: < 2.2e-16

由于 nls 汇总输出与 lm 汇总输出非常相似,我假设 nls 到 lm 对象的等效内容应该可以让 stargazer 发挥其魅力。

我有很多 nls 模型要包含在报告中,而 as.lm.nls 的失败让我陷入了困境。我需要关于 nls 对象的乳胶输出的绝望帮助。

关于如何进行的任何指针。

问候

K

【问题讨论】:

    标签: r stargazer


    【解决方案1】:

    对于 LaTeX 中的自定义输出表,我的经验是 xtablepackage 是最方便、最灵活的解决方案。

    让我们考虑一下你有一个nlsobject 并且 stargazer 不支持它的情况(也许有一天会支持它?)。

    ### Estimate model
    model <- nls(Y ~ <your function>(theta1, theta2, theta3))
    
    ### generate various parts for output
    sum_model = summary(model)
    mat_model = sum_model$coefficients
    
    ### generate coefficients, se, t-stat and p values 
    df_model = as.data.frame(mat_model)
    colnames(df_model) <- c("Coef.", "Std. error", "t-stat.", "p")
    
    mat <- data.frame(t(df_model))
    tbl <- xtable(mat)
    print(tbl, only.contents=TRUE, include.rownames=T, 
          include.colnames=F, floating=F,
          hline.after=NULL,
          file="summary_nls.tex")
    

    现在请注意,您可以使用 R 包xtable 根据您的需要定制输出。例如,我省略了整个 LaTeX tabular 环境,在 stargazer 中我永远无法摆脱它,我喜欢将 threeparttable 包与来自 LaTeX 包 booktabs 的命令一起使用。对于给定的玩具模型,一个简洁的输出看起来像这样:

    \begin{table}[t]
    \centering
    \begin{threeparttable}
    \captionabove{Regression results for nonlinear model.}
    \begin{tabular}{lccc}
          \toprule
           & Theta1 & Theta2 & Theta3\\
           & $\theta 1$ & $\beta$ & $\sigma$ \\
          \midrule
          \input{summary_nls}
          \bottomrule
       \end{tabular}
    \label{tab:nls_summary}
    \end{threeparttable}
    \end{table}
    

    我将上面的代码保留为模板,只是为更大、更复杂的模型添加行和列。与knitr 配对,这对我来说就像一个魅力。

    【讨论】:

      【解决方案2】:

      仔细阅读stargazer的参数签名后,可以使用coef、se、t和p参数生成tex格式的nls模型输出。您确实需要一个 lm 模型开始并用这些参数替换必要的部分。下面是一个快速的 hack,可以对其进行适当的修改。

      library(stargazer)
      
      ### start with an arbitrary lm model, following suited for the given situation
      lm1 = lm(rating ~ complaints + privileges + learning - 1, data=attitude)
      fakeX = c("complaints", "privileges", "learning")
      
      ### nls model to be represented by stargazer
      DNase1 <- subset(DNase, Run == 1)
      xx <- nls(density ~ SSlogis(log(conc), Asym, xmid, scal), DNase1)
      summary(xx)
      
      ### generate various parts for output
      sum_xx = summary(xx)
      mat_xx = sum_xx$coefficients
      colnames(mat_xx) = c("coef","se", "t", "p")
      indVarNames = rownames(mat_xx)
      
      ### generate coefficients, se, t-stat and p values 
      df_xx = as.data.frame(mat_xx)
      vCoef = df_xx$coef; names(vCoef)=fakeX
      vSE = df_xx$se; names(vSE)=fakeX
      vT = df_xx$t; names(vT)=fakeX
      vP = df_xx$p; names(vP)=fakeX
      
      formulaTxt = sum_xx$formula
      nParameters = sum_xx$df[1]
      nDF = sum_xx$df[2]
      rss = round(sum_xx$sigma, 3)
      convTolerance = xx$m$conv()
      
      ### various aesthetics for stargazer
      vTitle = "Regression Results Model: "
      vType = "latex"
      vDepLabel = c("density")
      outFile=c("./model.tex")
      vLines=c(sprintf("RSE: %0.3f", rss), sprintf("df = %d", nDF))
      vNotes=c(sprintf("Achieved convergence tolerance: %0.5f", convTolerance))
      
      ### and the output follows
      outStar = stargazer(lm1, title = vTitle, out=outFile, out.header=T,
          no.space=T, digits=3, type=vType, single.row=T,
          omit.stat = c("rsq","adj.rsq", "f", "n", "ser"),
          covariate.labels = indVarNames, dep.var.labels = vDepLabel,
          add.lines=list(vLines),
          notes=vNotes, notes.append=T,
          coef=list(vCoef), se=list(vSE), t=list(vT), p=list(vP)
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 2014-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多