4

ここで明らかな何かが欠けていると確信しています。ループを使用して入力を数式に変更し、その数式を含むものを生成しようとしています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!
4

1 に答える 1

4

昨年の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)
       })
于 2012-08-16T04:41:19.127 に答える