我已经获得了面板数据,并且一直在玩k-means聚类。所以现在我已经得到了一组大多数稳定的因子值,但是我想更加平滑,以便(例如)数据显示"怀俄明州在第1组中早年,进入第2组,然后进入第5组"而不是"怀俄明州在1,1,1,2,3,2,2,5,5,5和#34;组中。
所以我采用的方法是使用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。有什么想法吗?
谢谢! 瑞克
答案 0 :(得分: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()位(否则它会向下舍入数字)。我不确定那里发生了什么,但代码有效,所以我不担心它......