如何通过 R 中的多次试验在特定时间获得随机观察点?
How to get a random observation point at a specific time over multiple trials in R?
我正在研究 Spike Trains 和我的代码以获得这样的 spike train:
下面写了 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) 来进行您希望查看其尖峰间期向量的任何试验。我想要的视觉表示是:
对于每次试验,我想获得一个向量,该向量具有该点所在区间的长度。我也想弄清楚它的分布,但那是以后的事。任何人都可以帮我弄清楚如何编写代码吗?感谢任何帮助,即使只是关于如何 start/where 看起来。
您的数据
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
最近的两个尖峰的inter-spike间隔可以用
获得
sapply(distances, sum)
我正在研究 Spike Trains 和我的代码以获得这样的 spike train:
下面写了 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) 来进行您希望查看其尖峰间期向量的任何试验。我想要的视觉表示是:
对于每次试验,我想获得一个向量,该向量具有该点所在区间的长度。我也想弄清楚它的分布,但那是以后的事。任何人都可以帮我弄清楚如何编写代码吗?感谢任何帮助,即使只是关于如何 start/where 看起来。
您的数据
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
最近的两个尖峰的inter-spike间隔可以用
sapply(distances, sum)