Для каждой стволовой клетки (а точнее КОЕ) пишем таблицу-описание состояния колонии. Каждая строка это вектор пар, состоящих из идентификатора события и времени до его наступления. Каждый столбец это новая клетка (пара событие-время)
Вниание, ВОПРОС!: Как я собираюсь выбирать какое же событие произошло? Тут вопрос в конкурирующих рисках. Судя по всему нужно иметь еще и куммулитивную переменную возраста/времени/степени дифференцировки.
смотрим только последную строку. А вернее просматриваем тот вектор, который создали в прошлый раз. ГЛАВНОЕ, не затереть нужные значения. Т.е. мы его просто модифицируем
примерно так:
data a; input g1-g4; datalines; 1 2 3 4 ; run;
data a; set a; if g1 = 1 then d = 0; if g2 = 2 then f = 0; if g3 = 3 then g4 = .; if g4 = 4 then p = 1; run;
proc print ; run;
Разыгрывается события по функциям вероятности, и сравнивается что произошло раньше. Записываем, приплюсовываем. Проргоняем для всех клеток.
для клеток просматриваем какое событие произошло, в новое наблюдение записываем:
- деление -- 1) в рассматриваемую клетку разыгрываем новое событие, 2) создаём новую клетку, ставим ей статус новорожденной. Какие-то характеристики наследуются, какие-то новые.
- смерть/уход -- ставим мисинги во все переменные.
----- пока это модель жизнинного цикла одной колонии. Если добавить таблицы отсчета событий и/или...
Подцепляем созданный вектор к датасету (архив).
- макрос собственно анализа клетки, на входе номер клетки.
- макрос генератор события. На входе куууча переменных
- собственно макрос-контейнер 1-го и 2-го с итератором клеток. Выполняет одну итерацию деления.
- макрос контейнер-итератор предыдущего, выход по достижению предельного числа итераций, клеток или при вымирании популяции.
пока так.
Как получить последнее наблюдение: *data a; *set a *end = last; *if last; *run; Так, на всякий случай.