長くなっておりますが、今後同様のエラーが発生した人のためにこの質問の中で試行錯誤しておきます。
追記内容については、時間が経ちましたら質問内容下部に移動します。
==11/27 追記==
解決の見込み
Rに詳しい知人にエラーについて簡単に調べてもらったところ、glm関数のオプションmaxitの値をいじくることでエラー発生を抑えることができるかもしれないとのことです。
https://stackoverflow.com/questions/20814590/r-na-nan-inf-in-x-error
今日の午後に走らせてみて、結果を報告します。
またmaxitをいじくることによる統計的な影響などについて詳しい方がいましたら、ご教授いただきたいです。
結果
maxit<=19の場合
R
1#説明変数:距離対数、輸出年度、FTA/WTO、ブランチ、輸出相手国 2res4 <-glm(Value_USD_r~ log(distw)+year+fta_wto+branch+ImporterISO3, 3 data = dat_est_0201, family = poisson, maxit=19)
別なエラー発生
R
1 エラー: inner loop 1; cannot correct step size 2 追加情報: 警告メッセージ: 3step size truncated due to divergence
このエラーについて調べてみてもよく分かりませんでした。。。
今後試すこと
ImpoterISO3の変数の数が多いということがエラーの原因であると考えられるため、変数の数を少なくしてみてプログラムが正常に走るかを検証してみたいと思います。
======
前提・実現したいこと
R言語を用いて、貿易データをポアソン回帰分析しようと考えています。
glm関数のポアソン分布を用いているのですが、エラーメッセージが表示されてしまいます。
R言語を使って2週間程度のレベルですので、初歩的なミスでしたらごめんなさい。
また説明に不足点がありましたら教えてください。
どなたか、よろしくお願いいたします。
発生している問題・エラーメッセージ
glm.fit(x = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, でエラー: 'x' の中に NA/NaN/Inf があります
該当のソースコード
R
1#元データ読み込み 2dat_est_0201 <- read.csv("dat_est_0201.csv") 3names(dat_est_0201) 4 5#因子型に変換 6dat_est_0201$ImporterISO3 <- as.factor(dat_est_0201$ImporterISO3) 7dat_est_0201$year <- as.factor(dat_est_0201$year) 8dat_est_0201$fta_wto <- as.factor(dat_est_0201$fta_wto) 9dat_est_0201$branch <- as.factor(dat_est_0201$branch) 10 11#ポアソン回帰分析 12#目的変数:輸出額 13#説明変数:輸出年、距離対数、貿易協定、ブランチ、輸出国 14res4 <-glm(Value_USD_r~ log(distw)+year+fta_wto+branch+ImporterISO3, 15data = dat_est_0201, family = poisson) 16 17glm.fit(x = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, でエラー: 18 'x' の中に NA/NaN/Inf があります
該当のデータ
分析に用いる変数の説明
- ImporterISO3: 輸出相手国の3文字表記
- year: 貿易年
- distw: 輸出国と輸入国間の距離
- Value_USD_r: 輸出額
- fta_wto: 貿易協定の有無データ
- branch: ブランチの有無データ
R
1str(dat_est_0201) 2 3'data.frame': 2267 obs. of 11 variables: 4 $ DID : Factor w/ 10319 levels "AUS_ABW_1994",..: 11 12 13 14 15 16 17 1769 1770 1771 ... 5 $ ImporterISO3 : Factor w/ 198 levels "ABW","AFG","AGO",..: 1 1 1 1 1 1 1 34 34 34 ... 6 $ year : Factor w/ 12 levels "2004","2005",..: 1 2 3 4 5 6 7 8 9 10 ... 7 $ distw : num 15670 15670 15670 15670 15670 ... 8 $ gdp_o : num 6.13e+11 6.93e+11 7.47e+11 8.53e+11 1.06e+12 ... 9 $ gdp_d : num 2.23e+09 2.33e+09 2.42e+09 2.62e+09 2.79e+09 ... 10 $ Value_USD_0201: int 0 0 0 0 0 0 0 20059554 24973217 74507349 ... 11 $ Weight_kg_0201: int 0 0 0 0 0 0 0 1249833 2401694 13567991 ... 12 $ fta_wto : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... 13 $ branch : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 2 2 ... 14 $ Value_USD_r : num 0 0 0 0 0 ... 15
試したこと
欠損値データの確認
欠損値はないことを確認
R
1na_count <- sapply(dat_est_0201, function(y) any(is.na(y))) 2print(na_count) 3 4 DID ImporterISO3 year 5 FALSE FALSE FALSE 6 distw gdp_o gdp_d 7 FALSE FALSE FALSE 8Value_USD_0201 Weight_kg_0201 fta_wto 9 FALSE FALSE FALSE 10 branch Value_USD_r 11 FALSE FALSE
問題となっている説明変数の特定
ImporterISO3を除去した時のみ、プログラムは正常に走った
→ImporterISO3を説明変数とすることに問題あり
説明変数の数がデータ数を上回っていないことを確認
2267 > 198(ImporterISO3)+12(year)+2(fta_wto)+2(branch)
R
1str(dat_est_0201) 2 3'data.frame': 2267 obs. of 11 variables: 4 $ DID : Factor w/ 10319 levels "AUS_ABW_1994",..: 11 12 13 14 15 16 17 1769 1770 1771 ... 5 $ ImporterISO3 : Factor w/ 198 levels "ABW","AFG","AGO",..: 1 1 1 1 1 1 1 34 34 34 ... 6 $ year : Factor w/ 12 levels "2004","2005",..: 1 2 3 4 5 6 7 8 9 10 ... 7 $ distw : num 15670 15670 15670 15670 15670 ... 8 $ gdp_o : num 6.13e+11 6.93e+11 7.47e+11 8.53e+11 1.06e+12 ... 9 $ gdp_d : num 2.23e+09 2.33e+09 2.42e+09 2.62e+09 2.79e+09 ... 10 $ Value_USD_0201: int 0 0 0 0 0 0 0 20059554 24973217 74507349 ... 11 $ Weight_kg_0201: int 0 0 0 0 0 0 0 1249833 2401694 13567991 ... 12 $ fta_wto : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... 13 $ branch : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 2 2 ... 14 $ Value_USD_r : num 0 0 0 0 0 ... 15
==11/24 追記==
各変数データの詳細
distwのデータの中身についての質問がありましたので、各データ内容の詳細について追記しておきます。
(データの分かりやすい見せ方が思いつかなかったので、Excelにて失礼します。)
distw(貿易国間の距離)
0データは含まれていません。
2267データのそれぞれに、貿易国間のnumデータがあります。
Value_USD_r(輸出額)
貿易していない国同士も含まれていますので、0データがあります。