5

R では、対数変換された従属変数を使用してモデルを推定した可能性があります。

mfit <- lm(
    formula = log(salary) ~ yrs.service + yrs.since.phd, 
    data    = Salaries
  )

次に、モデル フレームを変更し、更新を呼び出してモデルを再調整することができます。

n     <- nrow(Salaries)
mfr   <- model.frame(mfit)[sample(1:n, size=n, replace=TRUE),]
mfit2 <- update(mfit, data = mfr)

これにより、エラーが発生します。

Error in eval(expr, envir, enclos) : object 'salary' not found

その理由は、数式にはまだ従属変数log(salary)があり、モデル フレーム内の変数は と呼ばれているためlog(salary)です。Rは、それを見つけsalaryて呼び出すことができると考えていlogます。リサンプリングを行わないと同じエラーが発生します。この例は、リサンプリングが必要な理由を示しています。

上記の手順は、行のリサンプリングが実行されるブートストラップ パッケージからのものです。この動作は予期されるものですか、それともバグですか? データ引数の変数を変換することで回避できることは知っていますが、これは面倒で見過ごされているようです...

4

2 に答える 2

0

からサンプリングする代わりに、 からサンプリングmodel.frame(mfit)できますna.omit(get_all_vars(myformula, Salaries))。したがって、あなたの例は次のようになります。

myformula <- log(salary) ~ yrs.service + yrs.since.phd

mfit <- lm(formula = myformula, data = Salaries)

n       <- nrow(Salaries)
newdata <- na.omit(get_all_vars(myformula, Salaries))[sample(1:n, size=n, replace=TRUE),]
mfit2   <- update(mfit, data = newdata)

次の簡単な例を使用して、それを確認し、データ フレームから同じ未加工の (変換されていない) データmodel.frame(myformula, df)を選択できます。na.omit(get_all_vars(myformula, df))

df <- data.frame(w = rnorm(10), x = rnorm(10), y = rnorm(10), z = rnorm(10))
df[1, 1] <- NA
df[2, 2] <- NA
df[3, 3] <- NA
df[4, 4] <- NA

identical(data.frame(na.omit(get_all_vars(z ~ w + x, df))), data.frame(model.frame(z ~ w + x, df)))
# [1] TRUE

比較のために不要な属性を削除するためだけに、 na.omit(get_all_vars(...))andmodel.frame(...)の結果をラップしたことに注意してください。data.frameもちろん、model.frameあなたの例で給与を変換するログなど、追加の作業を行います。ただし、元のデータをサンプリングするだけでよい場合は、正常にna.omit(get_all_vars(...))動作し、新しいデータ フレームをlmorに渡すことができますupdate

于 2019-06-18T22:01:48.953 に答える
-1

バグではないと思います。式は関数と演算子を受け取ることができるため、つまり、

log(foo)*3 ~ abs(fooller) + fooz

引数abs(fooller)を持つ関数の結果から呼び出されたオブジェクトを分離することはできません。abs()fooller

私の見解では、命名規則の問題です。変数または列に、関数と誤解される可能性のある名前を付けないでください。代わりに を使用できますsalary.log

于 2012-04-24T15:51:53.640 に答える