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"
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