Как создать шип поезда в 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))