【问题标题】:How to generate spike trains in R?如何在 R 中生成尖峰列车?
【发布时间】:2018-09-05 23:40:57
【问题描述】:

如果这看起来很明显,请原谅我,我对 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 函数以使输出创建一个矩阵,但我不知道该怎么做。任何帮助将不胜感激。

【问题讨论】:

    标签: r for-loop matrix spike


    【解决方案1】:

    这个功能可以简化很多,看看这个:

    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))
    

    【讨论】:

    • 嗨@missuse,非常感谢您的帮助!我检查了您的初始代码(简化),它没有给我想要的结果(无论输入 x 是什么,它都会返回一个 1 的字符串)。但是,如果您可以这样称呼它,我发现了“错误”。我们使用的简化函数实际上没有变量。因此,我将您的代码和我的代码结合起来,并提到了常量(fr、dt、nBins),然后将 MyPoissonSpikeTrain 设为 x 的函数,但使用 ifelse 运算符进行输出。它更短,但也运行良好。我现在将尝试其余的代码。再次感谢。
    • @R Tomar 我刚刚将函数从我的帖子复制到一个干净的 R 会话中,并且输出并非一直都是 1。但它主要是一个,因为它正在测试有多少来自均匀分布 0 - 1 的随机样本小于 0.1。这是 10%,所以通常有 0-2 个零。
    • 我用不同的 dt 对其进行了测试,因为我有同样的疑问,所以限制在 0.5 左右。但也许我在复制时做错了什么:)
    • 其余部分运行良好,非常感谢您的时间和努力。我真的很感激@missuse
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多