如何获得“nls”对象的漂亮Latex输出

3

我需要将“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对象的latex输出的绝望帮助。

请指教我如何继续进行。

问候

K

2个回答

3

对于LaTeX中自定义输出表格,我的经验是xtable包是最方便,同时灵活的解决方案。

让我们考虑您的情况,即当您有一个nls对象时,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)
)

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