Как добавить первый и последний элемент в каждый вектор (разной длины) списка в R, не замедляя код?

Я новичок в R и StackOverFlow. Так что, если я что-то упускаю, пожалуйста, дайте мне знать. Я работаю над моделированием неоднородных процессов, чтобы лучше понять поведение нейронов. Мой код работает таким образом, что у меня есть, скажем, 20 испытаний продолжительностью 2 секунд каждое (каждое испытание представляет собой поезд шипов). Затем список SpikeTimes дает мне список 20 векторов, где каждый вектор соответствует меткам времени, где произошли пики в этом конкретном испытании. [Например, SpikeTimes[1], который выглядит так, 0.002250802 0.053934034...1.971574170 2.023090384 означает, что в первом поезде шипов всплески произошли в 0.002250802, 0.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) последовательности шипов. Поэтому я хочу добавить этот список, чтобы каждый вектор включал первую запись как 0 и последнюю запись как 2.

Тогда мой SpikeTimes[1] будет выглядеть как 0 0.002250802 0.053934034...1.971574170 2, а другие SpikeTimes[i] будут выглядеть так же. Я попробовал SpikeTimes <- c(0, SpikeTimes) для ввода 0 в начале, но в результате в списке был только 21 вектор вместо 20 с вектором 0 в качестве первого элемента (я имею в виду, что понимаю, почему это произошло). Как я могу сделать это так, чтобы мой код не замедлялся? Я новичок в R, и чтение в Интернете не помогло решить эту конкретную проблему. Я был бы признателен за любой вклад.


person TimeLord    schedule 11.05.2018    source источник
comment
просто измените оператор NonHomoSpikes return на return(c(0, X, 2))   -  person pieca    schedule 11.05.2018
comment
@pieca спасибо, что сработало! Не могу поверить, что это было так просто. Не могли бы вы также посоветовать, как остановить mySpikeTimes в 2? Прямо сейчас, как показано в примере, он также включает некоторые экземпляры времени между 2.0 и 2.1 в качестве последних записей. Если бы вы могли дать несколько советов по этому поводу, это действительно помогло бы мне.   -  person TimeLord    schedule 11.05.2018
comment
ну, это связано с вашей моделью, но если вы хотите «вручную» остановить, если t›2, то вставьте if(t > 2) break после строки t <- LambdaInv(s)   -  person pieca    schedule 11.05.2018
comment
Большое спасибо за ваше время, это помогло. Я хотел бы одобрить ваш комментарий, если вы можете опубликовать его как ответ.   -  person TimeLord    schedule 11.05.2018


Ответы (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))
   }
person pieca    schedule 11.05.2018