2012-02-23 46 views
7

我是適合lme,lmer和glmer的模特。我需要使用summary()對象構造表並將其導出到Latex來顯示我的結果。 xtable,mtable和apsrtable不起作用。我看到一個以前的帖子(下面的鏈接)和一個針對lme4對象的解決方案,但不是針對這些。如何從lme,lmer,glmer提取回歸結果到Latex?

http://leftcensored.skepsi.net/2011/03/13/code-latex-tables-for-lme4-models/

這是我的模型的兩個例子是配件:

lme(y ~ time, data, na.action=na.omit, method="REML", random = ~ 1 | subject, control=lmeControl(msMaxIter = 200, msVerbose = TRUE)) 

glmer(y ~ time + (time | subject), data, family=binomial(link = "logit"), REML=T, control=list(maxIter = 800, maxFN=1000, msVerbose = TRUE)) 

任何幫助嗎?

感謝

回答

3

lme,我個人的版本低於;您可以使用其他類似的插件下載,例如從

http://www.menne-biomed.de/download

這是非常個性化的提取\Sexpr{}字符串LME/LM/GLM表作爲Dmisc的p值,但如果我喜歡的舍入真正顯著數字很多。對不起,包nlme做我需要的一切(並且超過lme/gaussian),所以還沒有lme4版本。

"latex.summary.lme" <- 
function(object, title="",parameter=NULL, file="", 
    shadep=0.05,caption=NULL,label=NULL,ctable=FALSE,form=NULL, 
    interceptp = FALSE, moredec=0, where="!htbp", ...) { 
    # This function can be mis-used for gls models when an explicit 
    # form is given 
    options(Hverbose=FALSE) 
    require('Hmisc') 
    require('nlme') 
    dd <- object$dims 
    method <- object$method 
    fixF <- object$call$fixed 
    xtTab <- as.data.frame(object$tTable) 
    sigp <- xtTab[,"p-value"]< shadep # cells that will be shaded 
    if (!interceptp){ 
    sigp[1] <- FALSE # intercept will never be shaded 
    # Replace small significances, discarding p-value for (Intercept) 
    xtTab[1,"p-value"] = 1 # we do not show it anyway, easier formatting 
    } 
    pval <- format(zapsmall(xtTab[, "p-value"],4)) 
    pval[as.double(pval) < 0.0001] <- "$< .0001$" 
    xtTab[, "p-value"] <- pval 
    xtTab[,"t-value"] <- round(xtTab[,"t-value"],1) 
    if (ncol(xtTab) == 5) # not for gls 
    xtTab[,"DF"] <- as.integer(xtTab[,"DF"]) 
    # extract formula 
    if (is.null(form)) { 
    if (!is.null(object$terms)) { 
     form=object$terms 
    } else { 
     form = formula(object) 
    } 
    } 
    if (is.null(parameter)) { 
    parameter=as.character(form[[2]]) 
    } 
    if (any(wchLv <- (as.double(levels(xtTab[, "p-value"])) == 0))) { 
     levels(xtTab[, "p-value"])[wchLv] <- "<.0001" 
    } 
    if (is.null(label)) 
    label <- lmeLabel("contr",form) 
    form <- deparse(removeFormFunc(as.formula(form)),width.cutoff=500) 

    form <- paste(sub('~','$\\\\sim$ ',form),sep="") 
    # All I(in factors are replaced with (This could be improved) 
    row.names(xtTab) <- 
    gsub("I\\(","(",dimnames(object$tTable)[[1]]) 
    row.names(xtTab) <- gsub("\\^2","\\texttwosuperior",row.names(xtTab)) 

    # Determine base level 
    levs <- lapply(object$contrasts,function(object) {dimnames(object)[[1]][1]}) 
    levnames <- paste(names(levs),levs,sep=" = ",collapse=", ") 
    # Try to locate numeric covariables 
# v1 <- all.vars(formula(object))[-1] 
## Changed 8.10.2008, not regression-tested 
    v1 <- all.vars(form)[-1] 
    numnames <- v1[is.na(match(v1,names(levs)))] 
    if (length(numnames > 0)) { 
    numnames <- paste(numnames," = 0",collapse=", ") 
    levnames <- paste(levnames,numnames,sep=", ") 
    } 
    if (is.null(caption)){ # TODO: Allow %s substitution 
    if (inherits(object,"lme")) 
     md = "Mixed model (lme)" else 
    if (inherits(object,"gls")) 
     md = "Extended linear model (gls)" else 
     md = "Linear model" 
    caption <- paste(md," contrast table for \\emph{", 
     parameter, "} (model ",form, 
    "). The value in row (Intercept) gives the reference value for ", 
     levnames,".",sep='') 
    } 
    caption.lot <- paste("Contrast table for ",parameter, " by ", 
     levnames) 
    ndec <- pmax(round(1-log10(xtTab[,2]+0.000001)+moredec),0) 
    xtTab[,1] <- formatC(round(xtTab[,1],ndec)) 
    xtTab[,2] <- formatC(round(xtTab[,2],ndec)) 
    if (ncol(xtTab) == 5) { 
    names(xtTab) <- c("Value","StdErr","DF","t","p") 
    pcol = 5 
    } else {# gls misuse 
    names(xtTab) <- c("Value","StdErr","t","p") 
    pcol = 4 
    } 
    # Only show intercept p/t when explicitely required 
    if (!interceptp){ 
    xtTab[1,pcol-1] <- NA 
    xtTab[1,pcol] <- '' 
    } 
    cellTex <- matrix(rep("", NROW(xtTab) * NCOL(xtTab)), nrow=NROW(xtTab)) 
    cellTex[sigp,pcol] <- "cellcolor[gray]{0.9}" 
    rowlabel <- ifelse(nchar(parameter) >9,"",parameter) 
    latex(xtTab, title=title, file=file, caption=caption,caption.lot=caption.lot, 
    caption.loc="bottom", label=label, cellTexCmds = cellTex, 
    rowlabel=rowlabel, ctable=ctable, where=where, 
    booktabs = !ctable, numeric.dollar=FALSE,col.just=rep("r",5),...) 
} 

"latex.lme" <- 
function(object, title="",parameter=NULL,file="",shadep=0.05, 
    caption=NULL,label=NULL,ctable=FALSE,form=NULL, 
    interceptp=FALSE, moredec= 0, where="!htbp",...) { 
    options(Hverbose=FALSE) 
    require('Hmisc') 
    require('nlme') 
    latex.summary.lme(summary(object),title=title,parameter=parameter, 
    file=file, shadep=shadep, caption=caption, 
    label=label, ctable=ctable, form=form, moredec=moredec, where=where,...) 
} 
+0

謝謝,迪特!這真的很有幫助。 – user1172558 2012-02-23 20:02:34

+0

當我使用您的功能時出現錯誤。你可以幫幫我嗎?錯誤是'[.data.frame'(xtTab,,「p-value」)中的錯誤:選擇了未定義的列' – user1172558 2012-02-24 00:17:17

+1

它可能是語言問題嗎?檢查你的語言環境是否有columen「p值」當你這樣一個總結(lme(....)) – 2012-02-25 11:08:10

6

編輯:

在編輯lme4軟件包更新和memisc的時間不再與這些對象的作品。包texrac是一種替代方案。我已經離開了這個答案,以防萬一memisc得到更新,它又開始工作。

memisc包中lme4表:

下面是一些代碼,我寫了一個片段:

GPusenonMH=lmer(GPEtc_c~Age.y+Measure+Gender+Marital2+Work2+(1|NHS), family="poisson", data=subset(lemurdata, Measure %in% c(1,3))) 

model1=mtable(GPusetotal, GPuseMH, GPusenonMH, summary.stats=FALSE) 

toLatex(model1) 

很明顯,你可以把summary.stats = TRUE,如果你想要任何東西。

請注意,默認情況下使用dcolumn和booktabs Latex軟件包,以便將它們放在Latex序言中或使用幫助文件中的命令(useBooktabs = FALSE,useDcolumn = FALSE)關閉它們。

+1

感謝你! 'mtable'與我的GLMER完美搭配。幫助頁面('?mtable')也非常有用,用於顯示如何以更正式的術語重新標記變量和模型,而不是選擇在R中使用 – Jota 2012-04-19 18:17:32

0

這裏是我的解決方案:假設fit是你的lme模型的結果,例如, fit <- lme(...)。如果你想擁有由summary(fit)顯示的所有變量,你可以簡單地輸入

> fit_text <- unclass(fit) 
> attributes(fit_text) 

,你會看到的結構類似的結果。然後,您可以將摘要報告的某些組件保存到txt文件或Rdata文件中。

6

我剛剛發現有一個coefsummary.mer對象的方法,它提供了所有必要的數據(對於固定效果)。返回的對象(在強制爲data.frame後)可以輕鬆交給選擇的格式化包(例如,xtableascii)。
請看下面的例子(其僅產生可用data.frame):

require(lme4) 

gm1 <- glmer(cbind(incidence, size - incidence) ~ period + (1 | herd), 
       family = binomial, data = cbpp) 

(res.table <- as.data.frame(coef(summary(gm1)))) 
##    Estimate Std. Error z value  Pr(>|z|) 
## (Intercept) -1.3985  0.2279 -6.137 0.0000000008416 
## period2  -0.9923  0.3054 -3.249 0.0011562741408 
## period3  -1.1287  0.3260 -3.462 0.0005368285553 
## period4  -1.5804  0.4288 -3.686 0.0002282168737