apsrtable для класса sarlm

Мне нравится 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

Я рвал на себе волосы несколько дней, пытаясь найти выход из этого. Какие-нибудь советы?


person gregmacfarlane    schedule 23.04.2012    source источник


Ответы (1)


Что ж, я думаю, что я, возможно, единственный человек на земле, который использует оба этих пакета вместе, но я нашел способ решить эту проблему.

Оказывается, источник ошибки в методе 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)
}
person gregmacfarlane    schedule 28.09.2012