0

我是 R 和 StackOverFlow 的新手。因此,如果我遗漏了什么,请告诉我。我正在模拟非同质过程以更好地理解神经行为。我的代码以我拥有的方式工作,例如每次20持续2几秒钟的试验(每个试验代表一个尖峰列车)。然后该列表SpikeTimes为我提供了一个20向量列表,其中每个向量对应于该特定试验中出现尖峰的时间戳。[例如。SpikeTimes[1]看起来像这样,0.002250802 0.053934034...1.971574170 2.023090384意味着在第一个尖峰列车中,尖峰发生在0.0022508020.053934034依此类推。我不知道为什么它还会显示超出我的秒数限制的时间戳2,但我稍后会处理]。我的代码看起来像这样——

nTrials=20
t_max=2.0000000


LambdaInv<- function(x){ifelse( x< 15, x/30,
                    ifelse(x >= 15 & x < 38, ((x-15)/46)+0.5,
                           ifelse(x >= 38 & x <53, ((x-38)/30)+1.0,
                                  ifelse(x >= 53 & x< 67.4, ((x-53)/72)+1.5, 
                                         ((x-67.4)/30)+1.7))))}

 t = 0 
 s = 0
 X = numeric(0)


 NonHomoSpikes <- function(t_max){
  while(t <= t_max){
    u <- runif(1)
    s <- s-log(u)
    t <- LambdaInv(s)
    X <- c(X,t)
       }
    return(X)
   }


SpikeTimes <- lapply(1:nTrials, function(x) NonHomoSpikes(2))

我的问题是,对于列表中的每个向量SpikeTimes;它给出了尖峰的时间戳,我还想包括尖峰列车的开始(即0)和结束(即2)。所以我想附加这个列表,让每个向量包含第一个条目 as0和最后一个条目 as 2

然后我的SpikeTimes[1]看起来0 0.002250802 0.053934034...1.971574170 2和其他SpikeTimes[i]看起来相似。我尝试在开头SpikeTimes <- c(0, SpikeTimes)输入0,但它只使列表有 21 个向量而不是 20 个向量0作为第一个元素(我的意思是我明白为什么会发生这种情况)。我怎样才能以一种不会使我的代码变慢的方式来做到这一点?我是 R 的新手,在互联网上阅读对这个特殊问题没有帮助。我将不胜感激任何形式的投入。

4

1 回答 1

1

解决方案:将NonHomoSpikes return语句更改为return(c(0, X, 2)).

要“手动”停止if t < 2(如评论中所述):

NonHomoSpikes <- function(t_max){
  while(t <= t_max){
    u <- runif(1)
    s <- s-log(u)
    t <- LambdaInv(s)
    if(t > 2) break
    X <- c(X,t)
       }
    return(c(0,X,0))
   }
于 2018-05-11T12:03:55.797 回答