How to test periodical patterns of events in a timeline Imagine the situation: there is a lecture of a famous scientist in auditorium which begins in - say 9:00. If students do not arrive in time - the door to auditorium will be closed and nobody allowed in.
There are many styles of arrival (random, wave-like, cummulative...). 
With my skills I am only able to discriminate between cummulative and random pattern by measuring the time gaps between subsequent arrivals. In cummulative pattern the gaps will be smaller as the time of the lecture approach. In random pattern there is no correlation between the length of time gaps and remaining time.
How do I test various (more complicated) patterns? (f.e. how do I prove that pattern is wave-like and not random statistically). The approach of measuring time between subsequent arrivals will not work, because it expands and contracts multiple times.
Are there any statistical tests which can work with such data?

# Example data
# wave-like pattern
wave.pat<-c(0,5,7,8.5,9.5,10.5,11,11.25,11.5,11.625,11.75,11.875,12,12.25,
12.5,13,14,15,16.5,18.5,23.5)
wave.like.data<-c(wave.pat, c(wave.pat+28.5), c(c(wave.pat+28.5)+28.5), 
c(c(c(wave.pat+28.5)+28.5))+28.5)
# cumulative pattern
cum.pat <- numeric(84)
cum.pat[1] <- 5
for (i in 2:7)
cum.pat[i] <- cum.pat[i - 1]+2
for (i in 8:17)
cum.pat[i] <- cum.pat[i - 1]+1.5
for (i in 18:30)
cum.pat[i] <- cum.pat[i - 1]+1
for (i in 31:55)
cum.pat[i] <- cum.pat[i - 1]+0.5
for (i in 55:84)
cum.pat[i] <- cum.pat[i - 1]+0.25
cum.pat[83]<-64.25
cum.pat[84] <- 64.50
cum.pat.data<-c(cum.pat + 44.5)
# random pattern
my.ch<-seq(0,109, 0.125)
random.pat.data<-sample(my.ch, 84, replace=FALSE)

# SOURCE DATA FRAME
my.data<-data.frame(timing=c(wave.like.data,cum.pat.data,random.pat.data),
                    type=rep(c("wave.like", "cumm.like", "random"), each=84))

# plot the data
library(lattice)
stripchart(timing ~ type, data=my.data, pch="|", ylim=c(0,4))

 A: These are just some quick ideas. There might be better methods.
#reproducible random data
set.seed(42)
my.ch<-seq(0,109, 0.125)
random.pat.data<-sample(my.ch, 84, replace=FALSE)

#sort all data
random.pat.data <- sort(random.pat.data)
wave.like.data <- sort(wave.like.data)
cum.pat.data <- sort(cum.pat.data)

You should always plot. I find plots vs. the index more informative.
layout(t(1:3))
plot(random.pat.data)
plot(wave.like.data)
plot(cum.pat.data)


Test correlation between differences and index to see if you have a "cumulative pattern":
cor.test(diff(random.pat.data), seq_along(diff(random.pat.data)))
#       cor 
#-0.1914366 
#p-value = 0.08297

cor.test(diff(wave.like.data), seq_along(diff(wave.like.data)))
#cor 
#  0
#p-value = 1

cor.test(diff(cum.pat.data), seq_along(diff(cum.pat.data)))
#       cor 
#-0.8972554 
#p-value < 2.2e-16

(Here, positive correlation would indicate a rush in the beginning and some people trickling in after the rush.)
You could fit cosinor models to test if there is seasonality in your data ("wave-like"):
library(season)
#fit models with different cycle values to find the model with lowest AIC
fits <- lapply(1:30, function(i) cosinor(random.pat.data~time, 
                                          date=time, cycles=i,
                                          data=data.frame(random.pat.data, time=as.Date(seq_along(random.pat.data)))))

#How many cycles fit best?
cycles <- which.min(sapply(fits, function(x) x$glm$aic))
#[1] 1

#Significant seasonality?
summary(fits[[cycles]])
#Significant seasonality based on adjusted significance level of 0.025  =  FALSE 

fits1 <- lapply(1:30, function(i) cosinor(wave.like.data~time, 
               date=time, cycles=i,
               data=data.frame(wave.like.data, time=as.Date(seq_along(wave.like.data)))))

cycles <- which.min(sapply(fits1, function(x) x$glm$aic))
#[1] 17

summary(fits1[[cycles]])
#Significant seasonality based on adjusted significance level of 0.025  =  TRUE 


fits2 <- lapply(1:30, function(i) cosinor(cum.pat.data~time, 
                                          date=time, cycles=i,
                                          data=data.frame(cum.pat.data, time=as.Date(seq_along(cum.pat.data)))))

cycles <- which.min(sapply(fits2, function(x) x$glm$aic))
#[1] 1

summary(fits2[[cycles]])
#Significant seasonality based on adjusted significance level of 0.025  =  TRUE
##Because there is curvature in the data.

