我确定我这里缺少明显的东西;正在尝试使用循环将输入更改为公式,然后生成包含该公式的glht。 (glht =一般线性假设检验)。谢谢大家!

df2 <- data.frame(f1=seq(1:5),f2=seq(4,8), y=sample(x=c(0,1),size=5,replace=TRUE))
df2 <- data.frame(lapply(df2,factor)) # convert to factors

library(multcomp)

for (i in 1:(length(df2)-1)){
  fmla <- as.formula( paste("y~",colnames(df2)[i],sep=""))
  fm1 <- glm (fmla, family = binomial("logit"), data=df2)
 }


这很有用;现在,我尝试动态传递f1以使下面的行:

  tuk <- glht(fm1, linfct=mcp(f1 ="Tukey"))


我努力了:

tuk <- glht(fm1,linfct=mcp(colnames(df2)[i] ="Tukey"))


但这给出了:

Error: unexpected '=' in " tuk <- glht(fm1,linfct=mcp(colnames(df2)[i] ="


我认为这与parse/eval有关。
所以我尝试了:

e1 <- paste("fm1,linfct=mcp(",colnames(df2)[i],"=Tukey)",sep="")
glht(e1)


给出:

Error in object$coefficients : $ operator is invalid for atomic vectors
Error in modelparm.default(model, ...) :  no 'coef' method for 'model' found!


然后尝试:

e1 <- parse(text=paste("fm1,linfct=mcp(",colnames(df2)[i],"=Tukey)",sep="") )
glht(e1)


给出:

Error in parse.default(text = paste("fm1,linfct=mcp(", colnames(df2)[i],  :
 <text>:1:4: unexpected ','
1: fm1,
      ^


最后:

e1 <- as.expression(paste("fm1,linfct=mcp(",colnames(df2)[i],"=Tukey)",sep="") )
glht(e1)


给出:

Error in UseMethod("vcov") : no applicable method for 'vcov' applied to an object of class "expression"
Error in modelparm.default(model, ...) :  no 'vcov' method for 'model' found!

最佳答案

去年,SO对基本identical question进行了询问和回答。下面的答案使用@hadley然后概述的策略,更详细地解释了为什么它起作用。



关于此问题的棘手之处在于,您需要将每个列名作为唯一参数的名称传递给mcp()。使用do.call()可能是完成此操作的最佳方法。

你想要什么:

mcp(f1 = "Tukey")


有变量X="f1"时如何获取它:

X <- "f1"
arg <- list("Tukey")
names(arg) <- X
do.call(mcp, arg)


就您而言,您可以执行以下操作:

require(multcomp)
df2 <- data.frame(f1=seq(1:5),f2=seq(4,8), y=sample(x=c(0,1),
                  size=5,replace=TRUE))
df2 <- data.frame(lapply(df2,factor)) # convert to factors

nms <- head(colnames(df2), -1)
lapply(nms,
       function(X) {
           fmla <- as.formula( paste("y~", X, sep=""))
           fm1 <- glm (fmla, family = binomial("logit"), data=df2)
           ## From here on down is the solution
           args <- list("Tukey")
           names(args) <- X
           cmp <- do.call(mcp, args)
           glht(fm1, linfct = cmp)
       })

10-08 05:08