2

我有一个表格,其中包含对restaurants(由 ID 标识)分数的观察。变量mean是在以每天为中心的一周窗口中收到的评论的平均评分(即从前 3 天到 3 天后),变量count是在同一窗口中收到的评论数量(参见下面的代码adput我的数据框的随机生成样本)。

我有兴趣查看那些在任一变量中都包含大峰值的餐厅(比如突然间他们的平均评分上升了很多,或者突然下降了)。对于那些餐馆,我想通过绘制分布来调查发生了什么(我有很多餐馆,所以我不能手动进行,我必须限制我的域以进行半手动检查)。

此外,由于我的数据是每天的,我希望它不那么精细。特别是,我想在一个值中平均给定月份的所有评级或计数。

我认为动物园应该帮助我做得很好:给定示例中的数据框,我想我可以将其转换为动物园时间序列,该时间序列以我想要的方式聚合并通过使用以下方式拆分我想要的方式:

z <- read.zoo(df, split = "restaurantID", 
       format = "%m/%d/%Y", index.column = 2, FUN = as.yearmon, aggregate = mean)

但是,在 restaurantID 上拆分不会产生预期的结果。我得到的是很多 NA:

     mean.1006054 count.1006054 mean.1006639 count.1006639 mean.1006704 count.1006704 mean.1007177 count.1007177
Lug 2004           NA            NA           NA            NA           NA            NA           NA            NA
Ago 2004           NA            NA           NA            NA           NA            NA           NA            NA
Nov 2004           NA            NA           NA            NA           NA            NA           NA            NA
Gen 2005           NA            NA           NA            NA           NA            NA           NA            NA
Feb 2005           NA            NA           NA            NA           NA            NA           NA            NA
Mar 2005           NA            NA           NA            NA           NA            NA           NA            NA
         mean.1007296 count.1007296 mean.1007606 count.1007606 mean.1007850 count.1007850 mean.1008272 count.1008272
Lug 2004           NA            NA           NA            NA           NA            NA           NA            NA
Ago 2004           NA            NA           NA            NA           NA            NA           NA            NA
Nov 2004           NA            NA           NA            NA           NA            NA           NA            NA
Gen 2005           NA            NA           NA            NA           NA            NA           NA            NA
Feb 2005           NA            NA           NA            NA           NA            NA           NA            NA
Mar 2005           NA            NA           NA            NA           NA            NA           NA            NA

请注意,如果我不在 restaurantID 列上拆分它,它会起作用。

df$website <- NULL
> z <- read.zoo(df, format = "%m/%d/%Y", index.column = 2, FUN = as.yearmon, aggregate = mean)
> head(z)
         restaurantID     mean count
Lug 2004      1418680 3.500000     1
Ago 2004      1370457 5.000000     1
Nov 2004      1324645 4.333333     1
Gen 2005      1425933 1.920000     1
Feb 2005      1315289 3.000000     1
Mar 2005      1400577 2.687500     1

此外,plot.zoo(z)有效,但生成的图表对我来说当然没有意义。

我的问题是:

1) 如何筛选在任一列中具有较高“月-月”峰值的餐厅?

2)如何拆分 restaurantID 并仅绘制此类餐厅的时间​​序列?

此处的数据(不符合 SO 的字数限制)

4

2 回答 2

0

开发了 robfilter r 包,用于过滤时间序列数据,以基于稳健的统计方法挑选出异常值以进行时间序列分析。您可以使用 adore.filter 函数将模式拟合到数据中,然后选择远离信号的异常值。

于 2013-02-23T06:09:08.927 回答
0

尝试:

# helper function to calculate change per time interval in a sequence
difflist <- function(v) {rr <- 0; for (i in 2:length(v)) {rr <- c(rr, v[i] - v[i-1])}; return(rr) }

# make center as dates
df$center <- as.Date(df$center,format='%m/%d/%Y')

# sort data frame in time order
df <- df[order(df$restaurantID, df$center),]

# now calculate the change in each column
deltas <- ddply(df, .(restaurantID), function(x) {cbind(center = x$center, delta_mean = difflist(x$mean), delta_count = difflist(x$count)) } )

# filter out only the big spikes
deltas_big <- subset(deltas, delta_mean > 2 | delta_count > 3)

# arrange the data
delta_melt <- melt(deltas_big,id.vars=c('restaurantID','center'))

# now plot by time
ggplot(delta_melt, aes(x=center,y=value,color=variable)) + geom_point()
于 2013-02-23T03:51:02.700 回答