6

Box-Cox 変換に最適な「ラムダ」パラメータを見つけようとしています。

MASSパッケージの実装を使用しているため、モデルを作成してラムダを抽出するだけで済みます。

関数のコードは次のとおりです。

library(MASS)

find_lambda <- function(x) {
  # Function to find the best lambda for the Box-Cox transform

  my_tmp <- data.frame(x = x) # Create a temporary data frame, to use it with the lm
  str(my_tmp) # Gives the expected output

  the_lm <- lm(x ~ 1, data = my_tmp) # Creates the linear model, no error here
  print(summary(the_lm)) # Prints the summary, as expected

  out <- boxcox(the_lm, plotit=FALSE) # Gives the error

  best_lambda <- out$x[which.max(out$y)] # Extracting the best fitting lambda
  return(best_lambda)
}

find_lambda(runif(100))

次のエラーが発生します。

Error in is.data.frame(data) : object 'my_tmp' not found 

興味深いのは、まったく同じコードが関数の外で機能していることです。つまり、何らかの理由で、MASSパッケージのboxcox関数がグローバル環境で変数を探しています。

何が起こっているのかよくわかりません... 何かアイデアはありますか?

追伸: このエラーは私の友人のラップトップでうまく再現されたので、ソフトウェア/ハードウェアの仕様は提供しません。

PPS予測パッケージで最初の問題を解決する方法を見つけましたが、それでもこのコードが機能しない理由を知りたいです。

4

3 に答える 3

5

ユーザーが提供したパッケージは、関数呼び出しを操作するときに呼び出しが実行された環境を追跡するのに常に優れているとは限りません。あなたにとって最も簡単な修正は、行を次のように変更することです

the_lm <- lm(x ~ 1, data = my_tmp)

the_lm <- lm(x ~ 1, data = my_tmp, y=True, qr=True)

yとが呼び出しqrから要求されていない場合、関数は呼び出しを介してこれらのパラメーターを使用して再実行しようとし、関数スコープ内で物事が台無しになるためです。lmboxcoxlmupdate

于 2016-09-27T15:27:39.513 に答える