質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Q&A

解決済

1回答

2222閲覧

エラー「all entries of 'x' must be nonnegative and finite」の解決方法をご教授ください

ayaka64

総合スコア1

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

0グッド

0クリップ

投稿2020/07/14 11:13

編集2020/07/16 08:23

前提・実現したいこと

Rで「tempR」というパッケージの「get.decluttered」という関数を使用して時系列データのfisherテストを行う際に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

stats::fisher.test(matrix(x, nrow = 2)) でエラー: all entries of 'x' must be nonnegative and finite

該当のソースコード

R

1x <- aggregate(名前[, -c(1:4)], list(samp = 名前$samp, attribute = 名前$attribute), sum) 2 3> x 4 time_0s1 time_0s2 time_0s3 time_0s4 time_0s5 time_0s6 time_0s7 5 0 0 0 0 0 0 0 6 time_0s8 time_0s9 time_0s10 time_1s1 time_1s2 time_1s3 time_1s4 7 0 0 0 0 0 0 0 8 time_1s5 time_1s6 time_1s7 time_1s8 time_1s9 time_1s10 time_2s1 90 0 0 0 0 0 0 100 0 0 0 0 0 0 110 1 0 0 0 0 2 120 1 0 1 1 0 5 131 2 2 0 2 0 1 142 0 7 1 2 2 3 157 0 1 4 0 7 5 162 3 10 8 0 1 9 171 8 7 3 6 16 9 180   1   8   2  12   7   3 198  21  13   0   1   9   2 2015   8   5   8  22  16   0 211  12   2  17  10   6   9 2226  19   0   2  14   2  18 2311   8   8  26  20   0   3 2416   4  19  11   8   8  28 2521   0   2  16   4  19  13 268   8  28  22   0   2  17 275  20  13   8   8  27  23 280   2  18   6  22  15  10 298  28  23   0   3  18   6 3022  15  12   8  30  24   0 314  18   6  22  15  14   8 3231  24   0   4  20   7  22 3316  14   9  30  24   0   4 3420   7  22  17  16   8  30 3524   0   4  20   7  22  18 3617   9  31  25   0   4  21 377  22  18  17   9  31  25 380   4  22   8  22  20  18 399  30  25   0   4  23   7 4023  21  18   9  30  25   0 414  23   7  23  20  18   9 4229  27   0   4  22   7  23 4320  19   9  31  27   1   4 4422   7  23  20  19  10  33 4526   2   5  23   7  23  22 4619  12  33  26   1   5  23 475  24  22  19  11  34  25 482   5  22   5  25  22  19 4911  33  25   1   5  22   5 5026  22  20  11  33  26   2 515  23   5  25  22  20  11 5234  26   2   6  23   5  25 5321  20  11  34  24   1   5 5423   5  25  21  20  11  35 5523   2   4  23   5  24  21 5619  10  36  23   2   4  22 575  24  21  20  10  38  23 581   4  21   5  24  20  19 5911  38  24   2   4  22   5 6024  20  19  11  38  24   1 614  21   4  25  20  17  12 6239  23   2   4  20   4  26 6320  17  12  38  23   2   4 6420   3  26  21  17  12  38 6523   1   4  20   3  26  21 6618  12  38  22   2   4  20 673  25  21  18  11  38  20 682   4  19   3  25  21  18 6910  38  20   1   4  17   1 7026  21  18  12  37  20   1 714  18   1  25  21  17  12 7237  20   0   5  19   1  25 7320  17  13  34  18   2   5 7420   1  25  20  17  13  33 7518   2   5  20   1  23  20 7617  12  34  18   1   5  19 771  23  21  16  12  32  18 782   5  18   1  23  20  15 7912  34  17   2   5  20   1 8023  21  15  13  34  17   1 815  20   1  23  21  15  10 8234  16   2   5  19   1  23 8321  16  10  33  16   2   4 8419   1  24  22  14  11  33 8515   1   4  18   1  24  22 8614  11  33  16   2   4  17 871  21  23  14   8  33  16 881   4  17   1  21  23  14 899  33  16   2   4  18   1 9022  23  13  10  33  14   2 914  17   1  23  23  13  10 9233  14   1   2  17   1  23 9323  12  10  34  14   2   2 9418   1  23  23  12  10  34 9513   2   2  17   1  22  23 9612   9  33  14   1   2  17 971  21  22  12   8  32  14 982   2  17   1  21  22  12 997  33  14   1   2  16   1 10021  22  12   7  32  14   2 1011  16   1  23  20   9   7 10232  13   2   1  16   0  23 10320   9   7  31  13   1   1 10416   0  23  18   9   8  31 10513   2   1  15   0  24  17 1069   7  31  12   2   1  16 1070  23  17   9   6  31  12 1081   1  16   0  23  17   8 1096  31  12   2   1  15   0 11024  17   8   7  30  11   1 1111  15   0  23  17   8   7 11228  11   2   1  15   0  20 11319   8   5  28  10   2   1 11415   0  21  19   7   6  27 11510   1   1  15   0  21  19 1167   7  27  10   2   1  15 1170  21  18   8   7  27   9 1182   1  15   0  20  17   8 1196  25   8   1   1  15   0 12020  17   7   6  24   8   2 1211  15   0  22  15   7   7 12224   7   2   1  14   0  22 12314   7   5  24   6   1   2 12413   0  23  14   7   5  24 1255   1   2  13   0  22  14 1267   5  25   5   0   2  13 1270  21  14   6   4  24   5 1281   2  14   0  20  13   6 1294  24   5   1   2  14   0 13022  13   5   5  22   5   0 1312  14   0  20  13   5   5 13221   5   0   2  14   0  21 13313   5   5  20   6   0   2 13414   0  20  13   5   5  20 1356   0   2  14   0  20  12 1365   4  19   6   0   2  14 1370  19  12   4   4  19   6 1380   1  14   0  17  11   4 1393  19   6   0   1  14   0 14016  11   4   3  19   5   0 1411  14   0  16  11   4   4 14219   3   0   1  13   0  15 14312   4   4  18   3   0   1 14413   0  13  12   4   3  18 1453   0   1  13   0  13  12 1464   3  18   3   0   1  13 1470  10  10   2   1  17   3 1480   1  12   0  10   8   2 1490  16   3   0   1  12   0 150 time_100s2 time_100s3 time_100s4 time_100s5 time_100s6 time_100s7 time_100s8 151 12 9 1 3 16 3 0 152 time_100s9 time_100s10 153 1 11 154 155ご参考までに、以下は「ojtcata」でxを出力した結果(3行目まで)です。 156> head(x, 3) 157 samp attribute time_0s time_1s time_2s time_3s time_4s time_5s time_6s time_7s time_8s 1581 1 Astringent 0 0 0 0 0 0 2 2 3 1592 2 Astringent 0 0 0 0 1 1 2 3 4 1603 3 Astringent 0 0 0 0 1 1 1 2 2 161 time_9s time_10s time_11s time_12s time_13s time_14s time_15s time_16s time_17s time_18s 1621 3 5 4 6 6 6 6 7 7 7 1632 3 3 2 2 2 3 3 3 3 3 1643 4 3 4 5 6 5 5 7 7 7 165 time_19s time_20s 1661 9 9 1672 5 5 1683 7 8 169 170 171 172p.1.checked <- x[x$samp == 1, -c(1:2)] 173p.1.eval <- length(unique(名前$cons)) 174p.not1.checked <- aggregate(x[x$samp != 1, -c(1:2)], 175 list(attribute = x$attribute[x$samp != 1]), sum)[, -1] 176p.not1.eval <- length(unique(名前$cons)) * (length(unique(名前$samp)) - 1) 177 178# reference lines for contrast products 179p.1.refline <- p.not1.checked / p.not1.eval 180p.1.refline 181 182# decluttering matrix corresponds to the dimensions of p.1.refline 183x <- unlist(p.1.checked) 184vector.checked 185vector.notchecked <- unlist(p.not1.checked) 186vector.notchecked 187p.1.declutter <- matrix(get.decluttered(x = unlist(p.1.checked), n.x = p.1.eval, 188 y = unlist(p.not1.checked), n.y = p.not1.eval), 189 nrow = nrow(p.1.checked))

試したこと

初心者のため何を試したらよいのかわからずパッケージの説明に記載されている例を参考にみてみたのですが、何が例と異なるのかわかりませんでした。

何卒、ご指導お願いいたします。

補足情報(FW/ツールのバージョンなど)

R 3.6.3
RStudio
を使用しています。どちらも先日インストールしたので最新のバージョンだと思います。
Excelのテキスト(タブ区切り)形式のファイルを読み込んで使用しており、データセットはパッケージの説明に使用されていた例のデータ(「ojtcata」)と同様にセットしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tetsunosuke

2020/07/14 11:17

> 'x' must be nonnegative and finite とのことなので、xの中身がおかしい(マイナスだったりしている?)ぽいです。 xに入るデータ(データフレームの内容)か、xそのものを出力した内容を貼ってみていただけますか? ojtcataでは起こらなかったが、実際に試したデータのせいで何かが起きているものと思われます。
ayaka64

2020/07/15 11:47

xを出力した内容を変更いたしました。(文字数の都合上、途中は数値のみにさせていただきました。) 見たところ負の数はない(有:1、無:0のデータを毎秒属性ごとに合計した数が返ってくる式だと認識しており、負の数は出てこないのではないかと考えています)のですが、何を改善すればいいのかご指導いただけますと幸いです。
tetsunosuke

2020/07/16 01:07

なるほどたしかにそうですね。(負の数はない) ちょっと再現させてみないと調べるのが難しいと思うので可能であれば読み込ませたデータそのものをどこかにアップロードしていただくことはできますか。 いただいたデータを見てみたんですけど21個ずつのレコードになっていると思いきやtime_100s10などが出てきてもともとのヘッダー情報がわからないのと、 その後のコードで x$sampとか名前$consが出てくるので、元データを見せていただいたほうが良いと思いました。
ayaka64

2020/07/16 07:32

データのURLを補足情報欄に記載しました。 あまり記載したままにしたくないので確認(保存)したらご連絡いただいてもよろしいでしょうか(URLを削除します)。 よろしくお願いいたします。
tetsunosuke

2020/07/16 07:56

今気が付きました なるほど...あまり公開してもよいようなデータではないのですね。 URLですが、確認したらアクセス権がなく閲覧できない状態でした。 なんかベストな情報の交換方法があればいいのですが...
tetsunosuke

2020/07/16 08:08 編集

ふと思ったのですが、 x$sampとかが存在しないように見えるのですがこのあたりはちゃんとあるのでしょうか? (もしないとしたら実行時に他のエラーもでているような)
ayaka64

2020/07/16 08:38 編集

データ共有ができておらず、申し訳ありません。分かりづらいかもしれませんが文章でデータセットを説明致します。 [,1] cons 被験者番号(1〜6) [,2] samp サンプルの品種番号(1〜5) [,3] sampno 品種内の番号(1〜10) [,4] attribute 感覚属性(1〜10) [,5] time_0 (0 or 1) 〜 [,106] time_100 (0 or 1)
ayaka64

2020/07/16 08:49

x$sampが存在しないというのは、samp列が空白ではないかということでしょうか? samp列に限らず全てのセルは埋まっています… もしご迷惑でなければメールでならデータを送れると思います。(見ず知らずの者なのでご迷惑なら遠慮なく仰ってください)
tetsunosuke

2020/07/16 08:54

なるほど、元データは106カラムあるデータなんですねー。 time_0s1 〜 time_0s10, time_2s1〜time2s10, ... time_10s10...と思って読んでいたらtime_20sってのが出てきてわけわからん!!! となってしまいました...。 ちょっと視点を変えると x = unlist(p.1.checked), n.x = p.1.eval, y = unlist(p.not1.checked), n.y = p.not1.eval これらのそれぞれの値の内容をチェックしてみたらどうでしょうか?
ayaka64

2020/07/16 08:59

メールアドレスを記載していただきありがとうございます。 コメント削除お願い致します。
tetsunosuke

2020/07/16 09:03

(うわぁ...コメントの削除は申請というプロセスになるのね...これは自分やらかした感
ayaka64

2020/07/16 09:06

そうなのですね…相談者側は編集が可能なので当方が記載しておけば良かったですね。申し訳ありません…
guest

回答1

0

ベストアンサー

この問題は get.declutterdの内部で呼び出しているstats::fisher.testに渡ったデータがおかしいことが原因のようです。

> get.decluttered function (x = x, n.x = n.x, y = y, n.y = n.y, alpha = 0.05) { if (any(is.na(x), is.na(y), is.na(n.x), is.na(n.y))) return(print("All parameters required")) if (length(x) != length(y)) return(print("Length of x and y must be equal")) if (length(n.x) > 1 & length(x) != length(n.x)) return(print("Length of x and n.x are mismatched")) if (length(n.y) > 1 & length(y) != length(n.y)) return(print("Length of y and n.y are mismatched")) tmp <- data.frame(x1 = x, x0 = n.x - x, y1 = y, y0 = n.y - y) fisher.test2 <- function(x) { requireNamespace("stats", quietly = TRUE) return(stats::fisher.test(matrix(x, nrow = 2))$p) } declutter = 1 * (apply(tmp, 1, fisher.test2) < alpha) declutter[declutter == 0] <- NA return(declutter = declutter) }

このように、get.declutteredのソースコードを確認し、
別途

myGetDecluttered <- function (x = x, n.x = n.x, y = y, n.y = n.y, alpha = 0.05) { if (any(is.na(x), is.na(y), is.na(n.x), is.na(n.y))) return(print("All parameters required")) if (length(x) != length(y)) return(print("Length of x and y must be equal")) if (length(n.x) > 1 & length(x) != length(n.x)) return(print("Length of x and n.x are mismatched")) if (length(n.y) > 1 & length(y) != length(n.y)) return(print("Length of y and n.y are mismatched")) tmp <- data.frame(x1 = x, x0 = n.x - x, y1 = y, y0 = n.y - y) fisher.test2 <- function(x) { requireNamespace("stats", quietly = TRUE) print(x) return(stats::fisher.test(matrix(x, nrow = 2))$p) } declutter = 1 * (apply(tmp, 1, fisher.test2) < alpha) declutter[declutter == 0] <- NA return(declutter = declutter) }

として呼び出すことで、fisher.testに渡っている内容のどこに問題があるかがわかります。
マイナスの値になっていそうということで、n.x - xがマイナスになっている、つまりn.x、呼び出し元で言う p.1.eval の算出あたりに問題がある、ということになると思います。

投稿2020/07/20 01:30

tetsunosuke

総合スコア1292

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ayaka64

2020/07/20 03:44

丁寧にご回答いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問