[R] mutual information for two time series
Spencer Graves
spencer.graves at pdf.com
Mon Apr 3 04:29:30 CEST 2006
Have you first done more traditional analyses like normal probability
plots and simple ARIMA models of each series individually? In
particular, have you tried this after transforming your two series to
the mean and difference between the two series? The mean series should
relate to what's happening in both hemispheres, while the difference
should relate more to differences.
Regarding "KernSmooth", I didn't see in its documentation any mention
of time series. Virtually all of the traditional distributional
analyses assume independence. Almost no time series are statistically
independent. I'd be particularly skeptical about any suggestions of
non-normality among time series with 128 observations per second.
I've skimmed through your code, but I've never used KernSmooth, so I
can't comment further. If you had included a short, self-contained,
reproducible example, I might have been able to say more.
hope this helps.
spencer graves
tim parkin wrote:
> Hi I hope this is going to the right place. I am trying to write a program
> which uses KernSmooth library to estimate mutual information between two
> time series at various different lags. At the moment it’s producing negative
> values, which is supposed to be impossible (something is fishy). I am
> summing across one row of the matrix to get p(value is in bin x) and summing
> across the columns to get p(value is in y), and just taking the value for
> the density at x,y to get the joint probability p(x,y), then just applying
> formulas for mutual information…. I know it’s kludgy… does anyone have any
> idea as to what I’ve done wrong?
>
> The data is EEG sampled at 128hz from the left hemisphere (C3) and right
> hemisphere of the brain during neurofeedback sessions and enters via a
> bivariate time series to datin, and lmax is the maximum lag to measure the
> mutual information at. I hope to use it to set up optimal bivariate
> embeddings but also to measure the strength of the relationship between the
> time series
>
>
>
> mutual2<-function(datin,lmax) {
>
> library(KernSmooth)
>
> lmax<-lmax+1
>
> lhplogp<-numeric(100)
>
> rhplogp<-numeric(100)
>
> mut<-numeric(lmax)
>
> jointplogp<-matrix(0,nrow=100,ncol=100)
>
> lh<-as.vector(datin[,1])
>
> rh<-as.vector(datin[,2])
>
>
>
> rhemb<-embed(rh,lmax)
>
>
>
> lhc<-lh[1:length(rhemb[,1])]
>
>
>
> for (i in 1:lmax) {
>
>
>
> rhc<-rhemb[,i]
>
>
>
>
>
>
>
> kd<-bkde2D(cbind(lhc,rhc),bandwidth=c(dpik(lhc),dpik(rhc)),gridsize=c(100,10
> 0),truncate=T)
>
> #2d kernel density estimate in 2 dimensions)
>
>
>
> kdmat<-as.matrix(kd$fhat)
>
> for (j in 1:100){
>
>
>
> p<-sum(kdmat[j,])
>
>
>
> lhplogp[j]<-p*log(p)
>
> }
>
>
>
> lhplogp[is.nan(lhplogp)]<-0
>
>
>
> hlh<- -1*sum(lhplogp)
>
> #entropy of left hemsisphere
>
> for (j in 1:100){
>
>
>
> p<-sum(kdmat[,j])
>
>
>
> rhplogp[j]<-p*log(p)
>
>
>
> rhplogp[is.nan(rhplogp)]<-0
>
> #entropy of right hemisphere }
>
> hrh<- -1*sum(rhplogp)
>
>
>
>
>
> for (j in 1:100){
>
> for (k in 1:100) {
>
> #finding joint probability
>
> p<-kdmat[j,k]
>
>
>
> jointplogp[j,k]<-p*log(p)
>
>
>
>
>
> }
>
> }
>
> jointplogp[is.nan(jointplogp)]<-0
>
> #sum of joint probabilities
>
> hjoint<-sum(jointplogp)*-1
>
>
>
>
>
> mut[i]<-hlh+hrh-hjoint
>
> #classic defn of mutual information
>
> maint<-paste("MI by Kernel Density is ",as.character(mut[i]))
>
> rhlab<-paste("rh lag ",as.character(i))
>
> xlabl<-"lh"
>
> contour(kd$x1,kd$x2,kd$fhat,xlab=xlabl,ylab=rhlab,main=maint)
>
>
>
> #dammit not producing realistic numbers
>
> }
>
>
>
> return(mut)
>
>
>
> }
>
>
>
> Thanks
>
> Tim Parkin
>
>
>
>
> ------------------------------------------------------------------------
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
More information about the R-help
mailing list