如何在R的多个试验中的特定时间获得随机观察点?

时间:2018-04-10 12:50:21

标签: r plot time-series distribution neuroscience

我正在研究Spike Trains和我的代码,以获得这样的尖峰列车: SpikeTrains

20次试验如下。该图像代表了5个试验。

fr = 100
dt = 1/1000 #dt in milisecond
duration = 2 #no of duration in s
nBins = 2000 #10msSpikeTrain
nTrials = 20 #NumberOfSimulations
MyPoissonSpikeTrain = function(p, fr= 100) {
 p = runif(nBins)
 q = ifelse(p < fr*dt, 1, 0)
 return(q)
  }

set.seed(1)
SpikeMat <- t(replicate(nTrials, MyPoissonSpikeTrain()))

plot(x=-1,y=-1, xlab="time (s)", ylab="Trial",
    main="Spike trains",
    ylim=c(0.5, nTrials+1), xlim=c(0, duration))
for (i in 1: nTrials)
 {
   clip(x1 = 0, x2= duration, y1= (i-0.2), y2= (i+0.4))
   abline(h=i, lwd= 1/4)
   abline(v= dt*which( SpikeMat[i,]== 1))
  }

每个试验都有随机时间点出现的尖峰。现在我想要努力的是获得一个适用于所有20个试验的随机样本时间点,并且我想得到每个试验中由此点所涉及的间隔长度组成的向量。获取尖峰发生点的时间向量的代码是

A <- numeric()
for (i in 1: nTrials)
 {
  ISI <- function(i){
   spike_times <- c(dt*which( SpikeMat[i, ]==1))
   ISI1vec <- c(diff(spike_times))
   A <- c(A, ISI1vec)
   return(A)}
    }

然后你打电话给ISI(i)进行你希望看到Interspike间隔矢量的试验。我想要的直观表示是:

NewSpikeTrain

对于每次试验,我想得到一个矢量,该矢量具有该点落入的间隔长度。我想弄清楚它的分布情况,但这是为了以后。任何人都可以帮我弄清楚如何编写我的方式吗?任何帮助都表示赞赏,即使它只是关于如何开始/在哪里看。

1 个答案:

答案 0 :(得分:1)

您的数据

set.seed(1)
SpikeMat <- t(replicate(nTrials, MyPoissonSpikeTrain()))

我建议将稀疏矩阵数据转换为出现峰值的索引列表

L <- lapply(seq_len(nrow(SpikeMat)), function(i) setNames(which(SpikeMat[i, ] == 1), seq_along(which(SpikeMat[i, ] == 1))))

抓取随机时间点

set.seed(1)
RT <- round(runif(1) * ncol(SpikeMat)) 
# 531

结果

distances包含距离最近的2个尖峰的距离 - 列表的每个元素都是一个命名向量,其中值是距离(到RT),它们的名称是它们在向量中的位置。 nearest_columns显示SpikeMat中每个峰值的原始时间点(列号)。

bookend_values <- function(vec) {
    lower_val <- head(sort(vec[sign(vec) == 1]), 1)
    upper_val <- head(sort(abs(vec[sign(vec) == -1])), 1)
    return(c(lower_val, upper_val))
}

distances <- lapply(L, function(i) bookend_values(RT-i))
nearest_columns <- lapply(seq_along(distances), function(i) L[[i]][names(distances[[i]])])

请注意,可以通过

获得两个最近的尖峰{!}}的尖峰间隔。
RT