У меня есть следующий код:
# Initial values of time and intercept
t0 <- 0
y0 <- 0
# The list to sample the slopes
cd <- list("a" = seq(0,1,.2), "b" = seq(1,2,.2))
# Function to sample slope given the list/df and number (from column cd)
sampler <- function(df, number){
res <- sample(df[[number]],1,replace = T)
return(res)
}
for (i in 1:length(df$t)){
if(df$Status[i] == "B"){
t0 <- df$t[i]
y0 <- df$y[i-1] - 0.05 # When status == B there will be a drop on the next intercept
df$y[i] <- y0
} else {
slope <- sampler(cd,df$cd[i])
df$y[i] <- y0 + slope*(df$t[i]-t0)
print(slope)
}
}
Здесь я пытаюсь заменить столбец y линейной функцией при заданном начальном значении перехвата y0 и наклоне, случайно выбранном из списка, условно по значению столбец cd.
Здесь моя проблема заключается в том, что каждый раз для каждой точки выбирается разный наклон. Но для последовательной серии состояний A (пока она не станет B) я хочу сохранить тот же уклон. Например, если при t = 1 выборочный уклон имеет значение x, я бы хотел сохранить наклон x до t = 4, а затем при t = 6 будет новая выборка, которая останется такой же до t = 9. Таким образом, в основном, из t = 1-4 это будет прямая линия, а затем после падения снова будет прямая из t = 6-9. Любая помощь могла бы быть полезна.
Вот воспроизводимый пример -
t <- c(1:10)
df <- as.data.frame(t)
df$y <- 0
df$Status <- "A"
df$Status[seq(5, length(df$t), 5)] <- "B"
df$cd[1:5] <- 1
df$cd[6:10] <- 2
Выход выглядит так:
> df
t y Status cd
1 1 0 A 1
2 2 0 A 1
3 3 0 A 1
4 4 0 A 1
5 5 0 B 1
6 6 0 A 2
7 7 0 A 2
8 8 0 A 2
9 9 0 A 2
10 10 0 B 2