rknitrsweavextablernw

Using xtable function on candisc::cancor output


I want to use xtable function on candisc::cancor output. But could not figure it out.

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"

Solution

  • If you look at methods(xtable) there is no method for cancor objects but there is xtable.data.frame which we could hopefully use, as the output of cancor look like data.frames.

    However, these values are not returned by cancor - look at str(cc). They are calculated in the print method. Look at candisc:::print.cancor.

    So create a quick extraction function to generate the cancor output as 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)))
            }
    

    Run helper function

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

    Can then use xtable.data.frame to generate the xtable output

    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]])
    

    You can tweak the helper function to also extract headers and such which can then be passed to xtable.data.frame as arguments.

    A quick answer that may get you started