web-dev-qa-db-ja.com

線形モデル関数lm()エラー:外部関数呼び出しのNA / NaN / Inf(引数1)

Data.frame aがあるとします

私が使う

m.fit <- lm(col2 ~ col3 * col4, na.action = na.exclude)

col2にはいくつかのNA値があり、col3およびcol4の値は1未満です。

私は取得し続けます

Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
NA/NaN/Inf in foreign function call (arg 1)

メーリングリストを確認しましたが、それはcol2NAsが原因であるようですが、na.action=na.exclude/omit/passを使用しようとしましたが、どれも機能していないようです。最初の10エントリでlmを再度テストしましたが、NAsが原因ではありません。この警告の問題は、Googleのすべての結果がNAを指しているように見えることです。

エラーを誤って解釈したか、lmを誤って使用していますか?

データは kaggle にあります。私は線形回帰を使用してMonthlyIncomeデータをモデリングしています(特定のglmファミリーを取得できなかったため)。使用する独自の変数を作成しましたが、既に存在する変数を使用してMonthlyIncomeをモデル化しようとすると失敗します。

23
Pk.yd

私はこのスレッドが本当に古いことを知っていますが、答えは完全ではないようで、同じ問題にぶつかりました。

私が抱えていた問題は、NAカラムにもNaNとInfがあったためです。それらを削除して、もう一度試してください。具体的には:

col2[which(is.nan(col2))] = NA
col2[which(col2==Inf)] = NA

18か月前の質問に役立つことを願っています。

34
slammaster

この完全な説明については、本を読む必要があります Rの初心者向けガイド 具体的には、次のエラーに言及しています。

Lm.fit(x、y、offset = offset、singular.ok = singular.ok、...)のエラー:外部関数呼び出しのNA/NaN/Inf(arg 4)

解決策は、強度データに小さな定数値、たとえば1を追加することです。小さな値の追加に関して、統計コミュニティで継続的な議論があることに注意してください。 Rで計算を行うときに、ゼロのログを使用することはできません。

8
algarecu

すべての可能な_na.omit_および_na.exclude_チェックの後、私は別の可能性に苦しみました。

私は次のようなものを取っていました:

lm(log(x) ~ log(y), data = ...)

それに気づかずに、私のデータセットの一部の値では、xまたはyがゼロになる可能性があります:log(0) = -Inf

気を付けるべきもう一つのこと!

5
arredond

オプションをリセットすることで、このタイプの問題を解決しました。 options(na.action="na.exclude")またはoptions(na.action="na.omit")

私は自分の設定をチェックし、以前にオプションを「na.pass」に変更しました。これにより、NAのyの観測値(y~x)が削除されませんでした。

2
Andrew

Col2(および他のすべての変数)のタイプを変更してみてください

col2 <- as.integer(col2)
1
user2475878

Col2に相当するものが整数ではなくinteger64であり、自然および多項式のスプライン、splines :: bsおよびsplines:nsを使用している場合、このエラーが発生しました。

m.fit <- lm(col1 ~ ns(col2))
m.fit <- lm(col1 ~ bs(col2, degree = 3))

標準整数への変換は私のために働いた:

m.fit <- lm(col1 ~ ns(as.integer(col2)))
m.fit <- lm(col1 ~ bs(as.integer(col2), degree = 3))
0
Scott Kaiser

reformulateを呼び出すときに引数を反転し、チェックせずにlm呼び出しで式を使用すると、このエラーが発生したため、予測変数と応答変数が間違っていました。

0

私はちょうど同じ問題に遭遇しました。を使用して有限要素を取得する

finiteElements = which(is.finite(col3*col4))
finiteData = data[finiteElements,]
lm(col2~col3*col4,na.action=na.exclude,data=finiteData)
0
d2a2d

従属変数に0がないことを確認してください。

0
Adrian Cadena

もう1つ注意すべきことは、log()やsin()などの関数を使用してxとyをinfにすることです。例えば。 log 0 = 0またはsin(pi)= 0.

0
Mihir Gada