繁体   English   中英

如何在R中生成峰值火车?

[英]How to generate spike trains in R?

如果这看起来很明显,请原谅我,我是R的新手。因此,我尝试获取看起来像矢量[1 0 1 1 0 0 0 1]的随机Spike Train,例如,我已经能够做到使用以下代码:

fr = 100 #Firing rate of 100Hz
dt = 1/1000 #Short duration of time dt
nBins = 10 #10msSpikeTrain 
x = runif(nBins) #Creating a "nBins" length string of random variable 
#falling uniformly between 0 and 1
x
y<- numeric(nBins) # creating an empty vector of size nBins
MyPoissonSpikeTrain = function(x){
for (i in 1:nBins){
if (x[i] < fr*dt)
y[i]=1
else
y[i]=0
}
return(y)
}  
#Creating a function that that returns its values in vector y as 1 if the 
#spike was fired 
#and 0 if the spike wasn't fired. 
#Spike was fired, if randomly generated x value is smaller than fr*dt. 
MyPoissonSpikeTrain(x)

一切正常,但我想创建一个矩阵,其中第一行将是上述过程的一个实例,第二行将是第二个实例,依此类推。

我希望这个过程发生(例如)20次,然后将我找到的每个y放入更大的矩阵的行中,例如Y。我知道我需要将y修改为矩阵而不是向量,并且然后相应地修改MyPoissonSpikeTrain函数,以使输出创建一个矩阵,但是我不知道该怎么做。 任何帮助将不胜感激。

此功能可以简化很多,请查看以下内容:

MyPoissonSpikeTrain = function(fr = 100, dt = 1/1000, nBins = 10){
  x = runif(nBins)
  y = ifelse(x < dt * fr, 0, 1)
  return(y)
}  

现在它已向量化,并且您可以根据需要更改参数。 现在生成所需的矩阵:

set.seed(1)
replicate(10, MyPoissonSpikeTrain())
#output
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1    1    1    1    1    1    1    1    1     1
 [2,]    1    1    1    1    1    1    1    1    1     0
 [3,]    1    1    1    1    1    1    1    1    1     1
 [4,]    1    1    1    1    1    1    1    1    1     1
 [5,]    1    1    1    1    1    0    1    1    1     1
 [6,]    1    1    1    1    1    0    1    1    1     1
 [7,]    1    1    0    1    0    1    1    1    1     1
 [8,]    1    1    1    1    1    1    1    1    1     1
 [9,]    1    1    1    1    1    1    0    1    1     1
[10,]    0    1    1    1    1    1    1    1    1     1

这里的每一列是一个循环,如果你希望它倒过来使用: t

t(replicate(10, MyPoissonSpikeTrain()))

如果要更改某些参数:

set.seed(1)
replicate(10, MyPoissonSpikeTrain(fr = 500))
#output
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1    1    1    1    1    1    0    1    0     1
 [2,]    0    1    0    0    1    1    1    1    0     0
 [3,]    0    0    0    0    0    0    0    1    1     0
 [4,]    1    0    0    1    0    0    1    0    1     1
 [5,]    1    0    1    1    1    1    1    0    1     0
 [6,]    0    0    0    1    0    0    0    1    0     1
 [7,]    0    1    1    1    0    1    0    1    1     0
 [8,]    0    0    0    1    1    0    0    1    1     1
 [9,]    1    0    0    1    0    0    1    1    1     0
[10,]    1    1    1    1    1    0    0    1    1     1

甚至更好:

MyPoissonSpikeTrain = function(fr = 100, dt = 1/1000, nBins = 10, ...){
  x = runif(nBins, ...)
  y = ifelse(x < dt * fr, 0, 1)
  return(y)
}  

因此您可以将其他参数传递给runif

set.seed(1)
replicate(10, MyPoissonSpikeTrain(max = 0.5))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM