0

パネル データを取得し、k-means クラスタリングをいじっています。これで、ほぼ安定したファクター値のパネルができましたが、これをもう少し滑らかにして、(たとえば) データが「ワイオミング州は以前はグループ 1 にあり、グループ 2 に移動しました。 、その後、「ワイオミングはグループ 1、1、1、2、3、2、2、5、5、5 でした」ではなく、グループ 5 に移動しました。

したがって、私が取っているアプローチは、rollapply() を使用してモーダル値を計算することです。以下は、モードを計算するコード ("Mode()") と、そのラッパー ("ModeR()") であり、モードをランダムに選択することでマルチモーダル ウィンドウの問題を (おそらくぎこちなく) 解決します。それはすべて問題ありませんが、それを rollapply() に入れると問題が発生します。

Mode <- function(vect){ # take a vector as input
  temp <- as.data.frame(table(vect)) 
  temp <- arrange(temp,desc(Freq)) # from dplyr
  max.f <- temp[1,2]
  temp <- filter(temp,Freq==max.f) # cut out anything that isn't modal
  return(temp[,1])
}
ModeR <- function(vect){
  out <- Mode(vect)
  return(out[round(runif(1,min=0.5000001,max=length(out)+0.499999999))])
}
temp <- round(runif(20,min=1,max=10)) # A vector to test this out on.
cbind(temp,rollapply(data=temp,width=5,FUN=ModeR,fill=NA,align="right"))

返された:

      temp   
 [1,]    5 NA
 [2,]    6 NA
 [3,]    5 NA
 [4,]    5 NA
 [5,]    7  1
 [6,]    6  1
 [7,]    5  1
 [8,]    5  1
 [9,]    3  2
[10,]    1  3
[11,]    5  3
[12,]    7  3
[13,]    5  3
[14,]    4  3
[15,]    3  3
[16,]    4  2
[17,]    8  2
[18,]    5  2
[19,]    6  3
[20,]    6  3

それを次のものと比較してください。

> ModeR(temp[1:5])
[1] 5
Levels: 5 6 7
> ModeR(temp[2:6])
[1] 6
Levels: 5 6 7

したがって、rollapply() での ModeR の適用方法に問題があるようです。何か案は?

ありがとう!リック

4

1 に答える 1

0

/u/murgsに感謝!彼のコメントは私を正しい方向に導いてくれました (sample() を使用して ModeR() を合理化するのに役立つことに加えて)。

上記の ModeR() は、係数を返します (Mode() と同様)。数字にする必要があります。次のようにコードを更新することで、これを修正できます。

Mode <- function(vect){ # take a vector as input
  temp <- as.data.frame(table(vect)) 
  temp <- arrange(temp,desc(Freq))
  max.f <- temp[1,2]
  temp <- filter(temp,Freq==max.f) # cut out anything that isn't modal
  return(as.numeric(as.character(temp[,1]))) #HERE'S THE BIG CHANGE
}
ModeR <- function(vect){
  out <- Mode(vect)
  return(out[sample(1:length(out),1)]) #HERE'S SOME IMPROVED CODE!
}

これで、rollapply() は期待通りの動作をします! まだ奇妙な as.character() ビットがあります (それ以外の場合は、数値が切り捨てられます)。何が起こっているのかわかりませんが、コードは機能するので心配する必要はありません...

于 2014-11-07T22:44:46.237 に答える