実際の問題に似た例を挙げて、これをやってみませんか:
library("multcomp")
data("mtcars")
mtcars$gear <- factor(mtcars$gear)
mtcars$cyl <- factor(mtcars$cyl)
xv <- c("gear","cyl")
ll <- list("Dunnett")
for(v in xv){
fo <- as.formula(paste("mpg",v,sep="~"))
fit <- lm(fo,data=mtcars)
names(ll) <- v
print(summary(glht(fit, linfct = do.call(mcp, ll))))
}
これにより、次のことが得られます。
Simultaneous Tests for General Linear Hypotheses
Multiple Comparisons of Means: Dunnett Contrasts
Fit: lm(formula = fo, data = mtcars)
Linear Hypotheses:
Estimate Std. Error t value Pr(>|t|)
4 - 3 == 0 8.427 1.823 4.621 0.000144 ***
5 - 3 == 0 5.273 2.431 2.169 0.072493 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Adjusted p values reported -- single-step method)
Simultaneous Tests for General Linear Hypotheses
Multiple Comparisons of Means: Dunnett Contrasts
Fit: lm(formula = fo, data = mtcars)
Linear Hypotheses:
Estimate Std. Error t value Pr(>|t|)
6 - 4 == 0 -6.921 1.558 -4.441 0.000235 ***
8 - 4 == 0 -11.564 1.299 -8.905 1.71e-09 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Adjusted p values reported -- single-step method)
ここでの秘訣は、 の最初の引数が であることに注意することmcp
です...
。これは通常、フォームのリストを渡すことができることを意味しlist(tag = value)
ます。tag
ここではasを指定できないので、単一の要素でv
リストを作成し、ループ内でこのリストのnames属性を be に変更します。次に、この引数リストを使用して呼び出すように調整します。ll
"Dunnett"
v
do.call()
mcp()
そして、完全を期すために、上記のコメントで@Joshが言及しているように、@Hadleyからのこの回答から、関数を使用してリストをより簡潔に述べることができますsetNames()
:
for(v in xv){
fo <- as.formula(paste("mpg",v,sep="~"))
fit <- lm(fo,data=mtcars)
print(summary(glht(fit, linfct = do.call(mcp, setNames(list("Dunnett"), v)))))
}