我喜欢apsrtable()
,并且发现扩展到其他类有点简单(特别是我已经为mlogit
个对象调整了它。但出于某种原因,apsrtableSummary.sarlm()
函数不像我写的其他黑客那样有效。
通常,我们需要重新定义系数矩阵,以便apsrtable()
知道在哪里找到它。这个代码是
"apsrtableSummary.sarlm" <- function (x){
s <- summary(x)
s$coefficients <- s$Coef
return(s)
}
我们还需要重新定义新类的modelInfo
,如下所示:
setMethod("modelInfo", "summary.sarlm", function(x){
env <- sys.parent()
digits <- evalq(digits, envir=env)
model.info <- list(
"$\\rho$" = formatC(x$rho, format="f", digits=digits),
"$p(\\rho)$" = formatC(x$LR1$p.value, format="f", digits=digits),
"$N$" = length(x$fitted.values),
"AIC" = formatC(AIC(x), format="f", digits=digits),
"\\mathcal{L}" = formatC(x$LL, format="f", digits=digits)
)
class(model.info) <- "model.info"
return(model.info)
})
然而,在定义了这两个函数之后,对apsrtable()
的调用不会打印系数(MWE使用lagsarlm
包中的spdep
示例。)
library(spdep)
library(apsrtable)
data(oldcol)
COL.lag.eig <- lagsarlm(CRIME ~ INC + HOVAL, data=COL.OLD,
nb2listw(COL.nb, style="W"), method="eigen")
summary(COL.lag.eig)
# Load functions above
apsrtable(COL.lag.eig)
## OUTPUT ##
\begin{table}[!ht]
\caption{}
\label{}
\begin{tabular}{ l D{.}{.}{2} }
\hline
& \multicolumn{ 1 }{ c }{ Model 1 } \\ \hline
% & Model 1 \\
$\rho$.rho & 0.43 \\
$p(\rho)$.Likelihood ratio & 0.00 \\
$N$ & 49 \\
AIC & 374.78 \\
\mathcal{L} & -182.39 \\ \hline
\multicolumn{2}{l}{\footnotesize{Standard errors in parentheses}}\\
\multicolumn{2}{l}{\footnotesize{$^*$ indicates significance at $p< 0.05 $}}
\end{tabular}
\end{table}
正如你所看到的,除了系数和标准误差不存在外,一切都很好。很明显,摘要重新定义有效,因为
apsrtableSummary(COL.lag.eig)$coefficients
Estimate Std. Error z value Pr(>|z|)
(Intercept) 45.0792505 7.17734654 6.280768 3.369041e-10
INC -1.0316157 0.30514297 -3.380762 7.228517e-04
HOVAL -0.2659263 0.08849862 -3.004863 2.657002e-03
我已经把头发拉了几天试图找到解决方法。有什么提示吗?
答案 0 :(得分:3)
好吧,我想我可能是世界上唯一一个同时使用这两个软件包的人,但我找到了解决这个问题的方法。
事实证明,错误的来源是coef
类对象的summary.sarlm
方法。通常,此方法返回带有系数表的矩阵,但对于此类,它只返回系数。以下代码修复了该问题。
setMethod("coef", "apsrtableSummary.sarlm", function(object) object$coefficients)
我还发现将rho
项包含为模型系数很有用(方法与此不一致)。
apsrtableSummary.sarlm <- function (x){
s <- summary(x)
s$rholine<- c(unname(s$rho), s$rho.se, unname(s$rho/s$rho.se),
unname(2 * (1 - pnorm(abs(s$rho/s$rho.se)))))
s$Coef <- rbind(s$rholine, s$Coef)
rownames(s$Coef)[1] <- "$\\rho$"
s$coefficients <- s$Coef
return(s)
}