1

私はいくつかの異なるテーブルを持っており、Rで次のような関数を書きたいと思っています:

表1:

          coordinates var1.pred  var1.var observed    residual      zscore fold
1  (2579410, 1079720)  5.057024 0.4325275    5.468  0.41097625  0.62489903    1
2  (2579330, 1079730)  5.329797 0.3945041    4.498 -0.83179667 -1.32431534    2
3  (2579260, 1079770)  4.788211 0.5576228    5.114  0.32578861  0.43628035    3
4  (2579930, 1080030)  5.067753 0.4972365    4.764 -0.30375347 -0.43076434    4
5  (2579700, 1079770)  5.116632 0.5792768    4.626 -0.49063190 -0.64463327    5
6  (2579540, 1079640)  4.865667 0.6122453    6.522  1.65633254  2.11682434    6
7  (2579860, 1079880)  5.139779 0.4655840    4.856 -0.28377887 -0.41589245    7

「observed」の値が次の 2 つの値の許容範囲を超えている場合は、それを外れ値としてラベル付けします。

var1.pred+(1.96*sqrt(var1.var))
var1.pred-(.96*sqrt(var1.var))

言い換えると:

      if   
   var1.pred-(1.96*sqrt(var1.var)) < 'observed' <  var1.pred-(1.96*sqrt(var1.var))

結果は正常、そうでない場合は外れ値になります。

また、列の名前は同じで、テーブル名は 1,2,3 .... です。

 dat <- structure(list(coordinates = structure(c(3L, 2L, 1L, 7L, 5L,                                
     4L, 6L), .Label = c("(2579260, 1079770)", "(2579330, 1079730)",                                
     "(2579410, 1079720)", "(2579540, 1079640)", "(2579700, 1079770)",                              
     "(2579860, 1079880)", "(2579930, 1080030)"), class = "factor"),                                
         var1.pred = c(5.057024, 5.329797, 4.788211, 5.067753, 5.116632,                            
         4.865667, 5.139779), var1.var = c(0.4325275, 0.3945041, 0.5576228,                         
         0.4972365, 0.5792768, 0.6122453, 0.465584), observed = c(5.468,                            
         4.498, 5.114, 4.764, 4.626, 6.522, 4.856), residual = c(0.41097625,                        
         -0.83179667, 0.32578861, -0.30375347, -0.4906319, 1.65633254,                              
         -0.28377887), zscore = c(0.62489903, -1.32431534, 0.43628035,                              
         -0.43076434, -0.64463327, 2.11682434, -0.41589245), fold = 1:7), .Names = c("coordinates", 
     "var1.pred", "var1.var", "observed", "residual", "zscore", "fold"                              
     ), row.names = c(NA, -7L), class = "data.frame")  
4

3 に答える 3

5

これはうまくいくはずです:

dat$outlier = with(as.data.frame(dat), 
                   ifelse(observed > (var1.pred + (.95*var1.var)) | # | = OR
                          observed < (var1.pred - (.95*var1.var)),
             "outlier", "normal"))

値が範囲内にあるかどうかではなく、範囲外にあるかどうかを確認するため、私のコードはあなたの説明とは少し異なります。上記はサンプルコードで実行されます:

> dat
         coordinates var1.pred  var1.var observed   residual     zscore fold
1 (2579410, 1079720)  5.057024 0.4325275    5.468  0.4109762  0.6248990    1
2 (2579330, 1079730)  5.329797 0.3945041    4.498 -0.8317967 -1.3243153    2
3 (2579260, 1079770)  4.788211 0.5576228    5.114  0.3257886  0.4362803    3
4 (2579930, 1080030)  5.067753 0.4972365    4.764 -0.3037535 -0.4307643    4
5 (2579700, 1079770)  5.116632 0.5792768    4.626 -0.4906319 -0.6446333    5
6 (2579540, 1079640)  4.865667 0.6122453    6.522  1.6563325  2.1168243    6
7 (2579860, 1079880)  5.139779 0.4655840    4.856 -0.2837789 -0.4158925    7
  outlier
1 outlier                                                                   
2 outlier                                                                   
3  normal                                                                   
4  normal                                                                   
5  normal                                                                   
6 outlier                                                                   
7  normal 
于 2013-01-28T13:24:16.813 に答える
5

ポールの答えはすべて良いですが、わずかに異なる提案です。

> dat
         coordinates var1.pred  var1.var observed   residual     zscore fold
1 (2579410, 1079720)  5.057024 0.4325275    5.468  0.4109762  0.6248990    1
2 (2579330, 1079730)  5.329797 0.3945041    4.498 -0.8317967 -1.3243153    2
3 (2579260, 1079770)  4.788211 0.5576228    5.114  0.3257886  0.4362803    3
4 (2579930, 1080030)  5.067753 0.4972365    4.764 -0.3037535 -0.4307643    4
5 (2579700, 1079770)  5.116632 0.5792768    4.626 -0.4906319 -0.6446333    5
6 (2579540, 1079640)  4.865667 0.6122453    6.522  1.6563325  2.1168243    6
7 (2579860, 1079880)  5.139779 0.4655840    4.856 -0.2837789 -0.4158925    7

> dat$label <- ifelse(dat$observed < dat$var1.pred-(1.96*sqrt(dat$var1.var)) |  dat$observed > dat$var1.pred+(1.96*sqrt(dat$var1.var)), "outlier", "normal" )

> dat
         coordinates var1.pred  var1.var observed   residual     zscore fold   label
1 (2579410, 1079720)  5.057024 0.4325275    5.468  0.4109762  0.6248990    1  normal
2 (2579330, 1079730)  5.329797 0.3945041    4.498 -0.8317967 -1.3243153    2  normal
3 (2579260, 1079770)  4.788211 0.5576228    5.114  0.3257886  0.4362803    3  normal
4 (2579930, 1080030)  5.067753 0.4972365    4.764 -0.3037535 -0.4307643    4  normal
5 (2579700, 1079770)  5.116632 0.5792768    4.626 -0.4906319 -0.6446333    5  normal
6 (2579540, 1079640)  4.865667 0.6122453    6.522  1.6563325  2.1168243    6 outlier
7 (2579860, 1079880)  5.139779 0.4655840    4.856 -0.2837789 -0.4158925    7  normal

更新:ちなみに、これを行う関数を探していて、列名が常に同じであると述べたように、関数を次のように書くことができます

checkRange <- function(dat) {
  dat$label <- ifelse(dat$observed < dat$var1.pred-(1.96*sqrt(dat$var1.var)) |  dat$observed   dat$var1.pred+(1.96*sqrt(dat$var1.var)), "outlier", "normal" )
  return(dat)
}
> dat <- checkRange(dat)

> dat
         coordinates var1.pred  var1.var observed   residual     zscore fold   label
1 (2579410, 1079720)  5.057024 0.4325275    5.468  0.4109762  0.6248990    1  normal
2 (2579330, 1079730)  5.329797 0.3945041    4.498 -0.8317967 -1.3243153    2  normal
3 (2579260, 1079770)  4.788211 0.5576228    5.114  0.3257886  0.4362803    3  normal
4 (2579930, 1080030)  5.067753 0.4972365    4.764 -0.3037535 -0.4307643    4  normal
5 (2579700, 1079770)  5.116632 0.5792768    4.626 -0.4906319 -0.6446333    5  normal
6 (2579540, 1079640)  4.865667 0.6122453    6.522  1.6563325  2.1168243    6 outlier
7 (2579860, 1079880)  5.139779 0.4655840    4.856 -0.2837789 -0.4158925    7  normal
于 2013-01-28T13:29:36.673 に答える
0

ハメド君に朗報です。このような作業を信じられないほど簡単にするパッケージが既に存在します。この種の作業で個人的に気に入っているのは、'plyr' パッケージです。[tolerances] 列をデータ フレームに追加するには、「ddply」関数を使用します (入力はデータ フレームで、出力はデータ フレームであるため、「ply」の接頭辞は「dd」です)。

library(plyr)
ddply(dat, .(fold), mutate, tolerances=ifelse(observed < (var1.pred - 0.95 * var1.var)|observed > (var1.pred + 0.95 * var1.var),"Outlier","Normal"))

後世のためにこれらの関数引数のそれぞれについて説明しますので、必要に応じて調整できます。データ フレーム [dat] からデータをロードするように「ddply」に指示しており、列 [fold] を主キーとして使用しています。キーに適合するデータを自動的に集計しようとするため、キーとして何を使用するかを「ddply」に指示する必要があります。[fold] を使用すると、すべての行の結果が得られます。次に、「mutate」関数を使用しています。これは元のデータをすべて保持しますが、指定した新しい列を追加します。最後に、新しい列 [tolerances] を指定しています。この列には、[observed] 値が下限許容値よりも小さいか、上限許容値よりも高いかどうかをチェックする「ifelse」ステートメントがあります。true の場合、値は "Outlier" になり、false の場合、値は "Normal" になります。

于 2013-01-28T13:35:09.727 に答える