R : cor.test で “not enough finite observations” となったときの対処

相関係数を算出する為に cor.test を使っていた所、「not enough finite observations」が発生しました。
データの数が少ないことが原因の様ですが対処の為に調べてみました。
結果として必要なデータ数は method によって次の通りでした。

  • pearson は 3 つ以上
  • kendall か spearman は 2 つ以上

NA 除外後、最低でも上記のデータ数が残るもので算出すれば良さそうです。

除外の例

R のサンプルデータ iris で試します。
iris 自体はデータが揃っているので、エラーになるダミーのデータを追加してみます。

iris_dummy <- iris
iris_dummy$Species <- as.character(iris_dummy$Species)
iris_dummy <- rbind(iris_dummy, list(1, 1, 1, 1, "japonica"))

エラーになることを確認します。

library(tidyverse)
iris_dummy %>%
  dplyr::group_by(Species) %>%
  dplyr::summarise(cor = cor.test(Sepal.Length, Petal.Length)$estimate)
Error in `dplyr::summarise()`:
! Problem while computing `cor = cor.test(Sepal.Length,
  Petal.Length)$estimate`.
ℹ The error occurred in group 1: Species = "japonica".
Caused by error in `cor.test.default()`:
! not enough finite observations

除外してみます。

iris_dummy %>%
  na.omit() %>%
  dplyr::group_by(Species) %>%
  dplyr::summarise(count = n()) %>%
  dplyr::filter(count >= 2) %>%
  dplyr::inner_join(iris_dummy, by = c("Species")) %>%
  dplyr::group_by(Species) %>%
  dplyr::summarise(cor = cor.test(Sepal.Length, Petal.Length)$estimate)
A tibble: 3 × 2
Species	cor
<chr>	<dbl>
setosa	0.2671758
versicolor	0.7540490
virginica	0.8642247

データ数が足りない japonica が除外できました。

参考:必要データ数の確認

必要なデータ数は、cor.test のソースコードからのものです。

if(method == "pearson") {
	if(n < 3L)
	    stop("not enough finite observations")
(中略)
else {
	if(n < 2)
	    stop("not enough finite observations")

コメント