gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:53:13 25 4
gpt4 key购买 nike

我确定我在这里遗漏了一些明显的东西;我正在尝试使用循环将输入更改为公式,然后生成 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!

最佳答案

本质上是 identical question去年在 SO 上被问及回答。下面的答案使用了@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)
})

关于R 将 colname 作为循环中的变量传递给 glht 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11980453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com