1

ベクトルをステップ実行して、IQR を使用して範囲を計算し、外れ値を見つけようとしています。IQR の右側の値を探してこのスクリプトを実行すると結果が得られ、左側に実行するとエラーが発生します: TRUE/FALSE が必要な場所に値がありません。データセットで true と false を削除するにはどうすればよいですか? ここに私のスクリプトがあります:

data = c(100, 120, 121, 123, 125, 124, 123, 123, 123, 124, 125, 167, 180, 123, 156)
Q3 <- quantile(data, 0.75) ##gets the third quantile from the list of vectors
Q1 <- quantile(data, 0.25) ## gets the first quantile from the list of vectors
outliers_left <-(Q1-1.5*IQR(data)) 
outliers_right <-(Q3+1.5*IQR(data))
IQR <- IQR(data)
paste("the innner quantile range is", IQR)
Q1 # quantil at 0.25
Q3 # quantile at 0.75
# show the range of numbers we have
paste("your range is", outliers_left, "through", outliers_right, "to determine outliers")
# count ho many vectors there are and then we will pass this value into a loop to look for 
# anything above and below the Q1-Q3 values
vectorCount <- sum(!is.na(data))
i <- 1
while( i < vectorCount ){
i <- i + 1
x <- data[i]
# if(x < outliers_left) {print(x)} # uncomment this to run and test for the left
if(x > outliers_right) {print(x)}
}

そして、私が得るエラーは

[1] 167
[1] 180
[1] 156
Error in if (x > outliers_right) { : 
missing value where TRUE/FALSE needed

このスクリプトを実行するとわかるように、右側に 3 つの外れ値が見つかり、エラーがスローされますが、IQR の左側でこれを再度実行すると、ベクトルに 100 の外れ値があります。他の結果が表示されずにエラーが発生します。このスクリプトを修正するにはどうすればよいですか? どんな助けでも大歓迎です。これを修正する方法について、私は何日もウェブと私の本を精査してきました。

4

2 に答える 2

3

コメントに記載されているように、エラーはwhileループの作成方法が原因です。最後の反復では、i == 16処理する要素は 15 個しかありません。i <= vectorCountからに変更するとi < vectorCount、問題が修正されます。

i <- 1
while( i < vectorCount ){
  i <- i + 1
  x <- data[i]
  # if(x < outliers_left) {print(x)} # uncomment this to run and test for the left
  if(x > outliers_right) {print(x)}
}
#-----
[1] 167
[1] 180
[1] 156

ただし、これは R の実際の動作ではなく、かなりのサイズのデータ​​に対してコードを実行するのにどれだけの時間がかかるかにすぐに不満を感じるでしょう。R は「ベクトル化」されているためdata、一度に の 15 要素すべてを操作できます。外れ値を印刷するには、次のようにします。

data[data > outliers_right]
#-----
[1] 167 180 156

または、OR 演算子を使用して一度にすべてを取得するには:

data[data< outliers_left | data > outliers_right]
#-----
[1] 100 167 180 156

少しコンテキストを説明すると、上記の論理比較は、の各要素に対してブール値を作成し、dataR は TRUE の要素のみを返します。次のように入力して、これを自分で確認できます。

data > outliers_right
#----
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE

ビットは実際には[抽出演算子であり、データ オブジェクトのサブセットを取得するために使用されます。背景については、ヘルプ ページを参照してください?"["

于 2012-10-22T03:35:33.230 に答える
1

あなたがi <= vectorCountそうiすることができるので、エラーメッセージが発生し、データからのvectorCountインデックス付けはになり、ステートメントは失敗します。i = i+1NAif

IQR に基づいて外れ値を見つけたい場合は、次を使用できます。findInterval

outliers <- data[findInterval(data, c(Q1,Q3)) != 1]

paste文字メッセージを作成するために使用するのもやめて、代わりprintedに使用messageします。

于 2012-10-22T03:34:48.833 に答える