目的
factanal 関数が返す結果を LaTeX ソースとして出力する。
使用法
xtable.factanal(obj, caption="caption", label="label", digits=3, rev=-1.5, booktabs=FALSE)
引数
obj factanal が返すオブジェクト
caption="caption" キャプション
label="label" ラベル
digits=3 因子負荷量の表示における小数点以下の桁数
rev=-1.5 行間を詰めるための,逆改行の大きさをミリ単位で指定(逆改行しない場合には 0 を指定する)
booktabs=FALSE TRUE なら \hline の代わりに \toprule, \midrule, \bottomrule を使う
ソース
インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/xtable-factanal.R", encoding="euc-jp")
xtable.prcomp <- function(obj, caption="caption", label="label", pcs=0, digits=3, rev=-1.5, booktabs=FALSE, type=c("latex", "html")) {
# prcomp 関数が返すオブジェクトを LaTeX ソースとして出力する
loadings <- t(t(obj$rotation)*obj$sdev)
if (pcs == 0 || pcs > ncol(loadings)) {
pcs <- sum(colSums(loadings^2) >= 1)
}
loadings.output(loadings[, 1:pcs, drop=FALSE], caption, label, digits, rev, booktabs, type=match.arg(type), pc=TRUE, promax=FALSE)
}
xtable.factanal <- function(obj, caption="caption", label="label", digits=3, rev=-1.5, booktabs=FALSE, type=c("latex", "html")) {
# factanal 関数が返すオブジェクトを LaTeX ソースとして出力する
loadings.output(obj$loadings, caption, label, digits, rev, booktabs, type=match.arg(type), pc=FALSE, promax=any(grepl("promax", obj$call)))
}
loadings.output <- function(loadings, caption, label, digits, rev, booktabs, type, pc, promax) {
if (pc) {
pc <- "主成分"
eig="固有値"
contr="& 寄与率"
} else {
pc <- "因子"
eig="因子負荷量二乗和"
contr="& 共通性"
}
n <- nrow(loadings)
factors <- ncol(loadings)
communality <- rowSums(loadings^2)
loadings <- cbind(loadings, communality)
eva <- colSums(loadings^2)
con <- eva/n*100
cum <- cumsum(con)
loadings <- rbind(loadings, eva, con, cum)
loadings[n+1:3, factors+1] <- NA
rownames(loadings)[n+1:3] <- c(eig, "寄与率(\\%)", "累積寄与率(\\%)")
vnames <- rownames(loadings)
# rotation <- as.character(a$call)
# print(unlist(strsplit(rotation, " ")))
if (booktabs) {
TOPRULE <- "toprule"
MIDRULE <- "midrule"
BOTTOMRULE <- "bottomrule"
} else {
TOPRULE <- MIDRULE <- BOTTOMRULE <- "hline"
}
align <- paste(rep("r", factors+2), collapse="")
if (type == "latex") {
cat(sprintf('\\begin{table}[htbp]\n\\caption{%s}\n\\label{%s}\n\\centering\n\\begin{tabular}{%s} \\%s\n', caption, label, align, TOPRULE))
cat(" &", paste(paste("第", 1:factors, pc, sep=""), collapse=" & "), contr, sprintf("\\\\ \\%s \n", MIDRULE))
n <- n+3
for (i in 1:n) {
cat(vnames[i])
format <- sprintf(" & $%%.%if$", ifelse(i >= n-1, 1, digits))
for (j in 1:(factors+1)) {
if (is.na(loadings[i,j])) {
cat(" & ")
}
else {
cat(sprintf(format, loadings[i,j]))
}
}
cat("\\\\")
if (i == n-3) cat(sprintf("\\%s", MIDRULE))
else if (i < n) cat(sprintf("[%smm]", rev))
else if (i == n) cat(sprintf("\\%s", BOTTOMRULE))
cat("\n")
if (i == n-3 && promax) break
}
cat("\\end{tabular}\\end{table}\n")
}
}
使用例
# x <- matrix(rnorm(1000), 100)
# colnames(x) <- paste("x", 1:10, sep="")
# a <- factanal(x, factors=2)
# xtable(a, "因子分析の結果", "table1")
LaTeX でタイプセットすると以下のようになる。