2017-12-20 6 views
1

Rのeffectsパッケージを使用して関数を開発しています。私はデバッグできない問題が常に発生しています。xlevelsで効果の機能が失敗する

私は次のコードを実行します:それは魔法のように動作

rm(list = ls()) # clear working directory 
library(effects) 

head(mtcars) 
mod <- lm(mpg ~ gear*cyl + gear + cyl + carb, data=mtcars) 
summary(mod) 

eff.dat <- effect("gear*cyl", mod=mod, KR=TRUE, xlevels=list(gear=seq(3,5,1))) 
eff.dat <- as.data.frame(eff.dat) 
View(eff.dat) 

gear3, 4,5cylの対応する値に等しいとき、私はmpg上の相互作用項の効果を得ることができます。

proba <- function(term, model, main) { 

    eff.dat2 <<- effect(term, mod=model, KR=TRUE, 
        xlevels=list(main=seq(min(mtcars[[main]]), 
              max(mtcars[[main]]), 1))) 
    eff.dat2 <<- as.data.frame(eff.dat2) 
} 

proba("gear*cyl", model=mod, main="gear") 

View(eff.dat2) 

xlevels一部に障害が発生したとの相互作用項がgearのデフォルト値、Iが指定されていたもののために推定されている:

はしかし、かつて私は次のように関数にこれを置きます。明らかに、これはより大きな関数の一部です。そうでなければ、私は effectのためだけに何かを書くのは気にしません。

ありがとうございました!何が起こるか

+0

なぜ戻り値なしで関数を作成していますが、副作用がありますか? – Roland

+0

また、 'setNames(list(seq(min)(mtcars [[main]))、 max(mtcars [[main]])、))、main)'を使用してください。あなたのコードはリスト要素の名前として '' main "'を使います。 – Roland

+0

ありがとう、これは動作します!私はそれを答えとして書くべきですが、私はそれを受け入れることを嬉しく思っています。しかし、なぜ私は 'setNames'を必要としているのか分かりません。 – eborbath

答えて

1

まずイラスト:リスト要素がxという方法

foo <- function(x) { 
    list(x = x) 
} 

foo("bar") 
#$x 
#[1] "bar 

注意。 setNamesは、プログラム名を設定するために使用することができます。

foo <- function(x) { 
    setNames(list(x), x) 
} 

foo("bar") 
#$bar 
#[1] "bar" 

また、あなたが<<-と機能の副作用を作成しないでください。それは非常に悪い習慣です。代わりに適切な戻り値を作成してください:

proba <- function(term, model, main) { 
    as.data.frame(
    effect(term, mod=model, KR=TRUE, 
      xlevels= setNames(list(seq(min(mtcars[[main]]), 
             max(mtcars[[main]]), 1)), main)) 
) 
} 

eff.dat2 <- proba("gear*cyl", model=mod, main="gear") 
all.equal(eff.dat, eff.dat2) 
#[1] TRUE 
関連する問題