Использование функции xtable для вывода candisc::cancor

Я хочу использовать функцию xtable на выходе candisc::cancor. Но не смог разобраться.

library(xtable)
library(candisc)
data(Rohwer, package="heplots")
X <- as.matrix(Rohwer[,6:10])  # the PA tests
Y <- as.matrix(Rohwer[,3:5])   # the aptitude/ability variables
(cc <- cancor(X, Y, set.names=c("PA", "Ability")))
Canonical correlation analysis of:
         5   PA  variables:  n, s, ns, na, ss 
  with   3   Ability  variables:  SAT, PPVT, Raven 

    CanR  CanRSQ   Eigen percent    cum                          scree
1 0.6703 0.44934 0.81599   77.30  77.30 ******************************
2 0.3837 0.14719 0.17260   16.35  93.65 ******                        
3 0.2506 0.06282 0.06704    6.35 100.00 **                            

Test of H0: The canonical correlations in the 
current row and all that follow are zero

     CanR  WilksL      F df1   df2  p.value
1 0.67033 0.44011 3.8961  15 168.8 0.000006
2 0.38366 0.79923 1.8379   8 124.0 0.076076
3 0.25065 0.93718 1.4078   3  63.0 0.248814
xtable(cc)

Error in UseMethod("xtable") : 
  no applicable method for 'xtable' applied to an object of class "cancor"

person MYaseen208    schedule 08.09.2014    source источник


Ответы (1)


Если вы посмотрите на methods(xtable), там нет метода для cancor объектов, но есть xtable.data.frame, который мы могли бы использовать, так как вывод cancor выглядит как data.frames.

Однако эти значения не возвращаются cancor — посмотрите на str(cc). Они рассчитываются по методу print. Посмотрите на candisc:::print.cancor.

Поэтому создайте функцию быстрого извлечения, чтобы сгенерировать вывод cancor как data.frames.

outfun <- function(X) { 
              CanR = X$cancor  
              CanRSQ = CanR^2  
              Eigen = CanRSQ/(1 - CanRSQ)
              percent = 100 * Eigen/sum(Eigen)
              cum = cumsum(percent)
              list(tab1 = data.frame(CanR, CanRSQ, Eigen, percent, cum) ,
                   tab2 = as.data.frame(candisc:::Wilks.cancor(X)))
        }

Запустить вспомогательную функцию

(out <- outfun(cc))

# or run it like
out <- outfun(cancor(X, Y, set.names=c("PA", "Ability")))

Затем можно использовать xtable.data.frame для создания вывода xtable.

xtable:::xtable.data.frame(out[[1]])

# % latex table generated in R 3.1.1 by xtable 1.7-3 package
# % Wed Sep 17 18:32:07 2014
# \begin{table}[ht]
# \centering
# \begin{tabular}{rrrrrr}
#   \hline
#  & CanR & CanRSQ & Eigen & percent & cum \\ 
#   \hline
# 1 & 0.67 & 0.45 & 0.82 & 77.30 & 77.30 \\ 
#   2 & 0.38 & 0.15 & 0.17 & 16.35 & 93.65 \\ 
#   3 & 0.25 & 0.06 & 0.07 & 6.35 & 100.00 \\ 
#    \hline
# \end{tabular}
# \end{table}

xtable:::xtable.data.frame(out[[2]])

Вы можете настроить вспомогательную функцию, чтобы она также извлекала заголовки и тому подобное, которые затем можно было бы передать в xtable.data.frame в качестве аргументов.

Быстрый ответ, который может помочь вам начать

person user20650    schedule 17.09.2014
comment
Большое спасибо за вашу помощь и предоставление очень полезного ответа. Очень признателен. Спасибо - person MYaseen208; 17.09.2014
comment
Необходимо внести несколько изменений в as.data.frame(candisc:::Wilks.cancor(cc)), потому что cc не определено. - person MYaseen208; 17.09.2014
comment
ура, снова забыл очистить свое рабочее пространство перед публикацией;) - person user20650; 17.09.2014