Как создать шип поезда в R?

Извините, если это кажется очевидным, я ОЧЕНЬ новичок в R. Поэтому я пытаюсь получить случайный Spike Train, который выглядит как вектор [ 1 0 1 1 0 0 0 1] и, например, я смог это сделать используя следующий код:

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)

Это работает все хорошо, но я хочу создать матрицу, где 1-й ряд будет одним экземпляром описанной выше процедуры, 2-й ряд будет 2-м экземпляром и так далее.

Я хочу, чтобы этот процесс происходил (скажем) 20 раз, а затем поместил каждого отдельного y, который я нахожу, в строку более крупной матрицы, скажем Y. Я понимаю, что мне нужно изменить свой y, чтобы он был матрицей, а не вектором, и затем измените мою функцию MyPoissonSpikeTrain, чтобы выходные данные создали матрицу, но я не могу понять, как это сделать. Любая помощь будет оценена.

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))
Другие вопросы по тегам