8

次のコードを使用したパッケージNLMEに問題があります。

library(nlme)
x <- rnorm(100)
z <- rep(c("a","b"),each=50)
y <- rnorm(100)
test.data <- data.frame(x,y,z)
test.fun <- function(test.dat)
{
    form <- as.formula("y~x")   
    ran.form <- as.formula("~1|z")
    modell <- lme(fixed = form, random=ran.form, data=test.dat)
    pseudo.newdata <- test.dat[1,]
    predict(modell, newdata= pseudo.newdata) ###THIS CAUSES THE ERROR!
}

test.fun(test.data)

予測はエラーを引き起こします、そして私はすでにそれを基本的に引き起こすものを見つけました。

modellオブジェクトは、呼び出された方法を保存し、predictはそれを使用して予測を行うようですが、正しい名前空間で式オブジェクトを検索しないため、formulaオブジェクトformおよびran.formを見つけることができません。実際、これを行うことで問題を回避できます。

 attach(environment(form), warn.conflicts = FALSE)
 predict(modell, newdata= pseudo.newdata) 
 detach()

ただし、私の長期的な目標は、モデルをディスクに保存して後で使用することです。数式オブジェクトも保存してみることができると思いますが、これは問題に対処するための非常に面倒で面倒な方法だと思います。

ある種のバッチプロセスで異なる定義を持つ多くのモデルを作成し、それらを回避できないため、明示的に書き留めるのではなく、自動生成された数式オブジェクトを使用します。したがって、私の理想的な解決策は、lmeオブジェクトを作成して、後で数式オブジェクトを忘れて、「正しく機能する」と予測できるようにする方法です。助けてくれてありがとう。

4

1 に答える 1

5

に置き換えlme(arg1, arg2, arg3)てみてくださいdo.call(lme, list(arg1, arg2, arg3))

library(nlme)
x <- rnorm(100)
z <- rep(c("a","b"),each=50)
y <- rnorm(100)
test.data <- data.frame(x,y,z)
test.fun <- function(test.dat)
{
    form <- as.formula("y~x")   
    ran.form <- as.formula("~1|z")
    ## JUST NEED TO CHANGE THE FOLLOWING LINE
    ## modell <- lme(fixed = form, random=ran.form, data=test.dat)
    modell <- do.call(lme, list(fixed=form, random=ran.form, data=test.data))
    pseudo.newdata <- test.dat[1,]
    predict(modell, newdata= pseudo.newdata) ###THIS CAUSES THE ERROR!
}

test.fun(test.data)
#          a 
# 0.07547742 
# attr(,"label")
# [1] "Predicted values"

これが機能するのは、それが構築する呼び出しを評価するdo.call()に、呼び出しフレームで引数リストを評価するためです。それが役立つ理由を確認するには、を入力してからコードを実行してマイニングし、ブラウザーにポップされたときに出力されるデバッグメッセージを比較します。lme()debug(predict)

于 2012-08-02T14:53:55.097 に答える