首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R将colname作为循环中的变量传递给glht函数

R将colname作为循环中的变量传递给glht函数
EN

Stack Overflow用户
提问于 2012-08-16 11:46:16
回答 1查看 1.7K关注 0票数 4

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

代码语言:javascript
复制
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来生成下面的代码行:

代码语言:javascript
复制
  tuk <- glht(fm1, linfct=mcp(f1 ="Tukey"))

我试过了:

代码语言:javascript
复制
tuk <- glht(fm1,linfct=mcp(colnames(df2)[i] ="Tukey"))

但这给了我们:

代码语言:javascript
复制
Error: unexpected '=' in " tuk <- glht(fm1,linfct=mcp(colnames(df2)[i] ="

我以为这会和parse/eval有关。所以我试着:

代码语言:javascript
复制
e1 <- paste("fm1,linfct=mcp(",colnames(df2)[i],"=Tukey)",sep="")
glht(e1)

提供:

代码语言:javascript
复制
Error in object$coefficients : $ operator is invalid for atomic vectors
Error in modelparm.default(model, ...) :  no 'coef' method for 'model' found!

然后尝试:

代码语言:javascript
复制
e1 <- parse(text=paste("fm1,linfct=mcp(",colnames(df2)[i],"=Tukey)",sep="") )
glht(e1)

提供:

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

最后:

代码语言:javascript
复制
e1 <- as.expression(paste("fm1,linfct=mcp(",colnames(df2)[i],"=Tukey)",sep="") )
glht(e1)

提供:

代码语言:javascript
复制
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!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-16 12:41:19

去年,一个本质上是identical question的问题被问到了,也被回答了。下面的答案使用了@hadley当时概述的策略,更详细地解释了它的工作原理。

这个问题的棘手之处在于,您需要将每个列名作为唯一参数的名称传递给mcp()。使用do.call()可能是实现这一目标的最佳方式。

你想要什么:

代码语言:javascript
复制
mcp(f1 = "Tukey")

当你有一个变量X="f1"的时候如何获取它

代码语言:javascript
复制
X <- "f1"
arg <- list("Tukey")
names(arg) <- X
do.call(mcp, arg)

在您的例子中,您可以这样做:

代码语言:javascript
复制
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)
       })
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11980453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档