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 对象的乳胶输出的绝望帮助。

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

问候

ķ

4

2 回答 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。例如,我省略了整个 LaTeXtabular环境,我永远无法摆脱它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此搭配对我来说就像是一种魅力。

于 2014-11-26T15:43:19.737 回答
2

After careful reading of the arguments signature for stargazer, nls model output in tex format can be generated using coef, se, t, and p arguments. You do need an lm model to begin with and replace the necessary parts with these arguments. Below is a quick hack and appropriate modifications can be made to it.

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)
)
于 2014-05-06T14:09:41.033 回答