У меня есть матрица, в которой отдельные лица представлены в виде строк, а моменты времени — в виде столбцов. Значение в матрице представляет собой вероятность того, что событие произойдет с субъектом в каждый момент времени.
set.seed(123)
prob_mat <- matrix(round(runif (15), 2), 5, 3,
dimnames = list(paste0('id', 1:5), c(1.2, 2.5, 3.1)))
# 1.2 2.5 3.1
# id1 0.29 0.05 0.96
# id2 0.79 0.53 0.45
# id3 0.41 0.89 0.68
# id4 0.88 0.55 0.57
# id5 0.94 0.46 0.10
У меня также есть вектор времени с именем time_vec
.
time_vec <- c(1.7, 2.9, 4)
Я хочу оценить вероятности для каждого субъекта в моменты времени, записанные в time_vec
, используя линейную интерполяцию. Например, момент времени 1,7 находится между 1,2 и 2,5 с расстоянием 0,5 от 1,2 и 0,8 от 2,5, поэтому интерполированные вероятности должны быть
(prob_mat[, '1.2'] * 0.8 + prob_mat[, '2.5'] * 0.5) / 1.3
# id1 id2 id3 id4 id5
# 0.1976923 0.6900000 0.5946154 0.7530769 0.7553846
Обратите внимание, что момент времени 4
находится за пределами интервала [1.2, 3.1]
. В качестве оценок мы используем значения на ближайшее время, т. е. 3.1
. Ожидаемый результат следующий:
1.7 2.9 4
id1 0.1976923 0.6566667 0.96
id2 0.6900000 0.4766667 0.45
id3 0.5946154 0.7500000 0.68
id4 0.7530769 0.5633333 0.57
id5 0.7553846 0.2200000 0.10
Я пробовал apply()
с approx()
по строкам, но эффективность для большой матрицы низкая.
Мы можем использовать approx()
, чтобы определить позиции time_vec
внутри prob_mat
, а затем использовать оператор по модулю (%%
), чтобы получить десятичную часть позиции. Это значение в точности соответствует весу, необходимому для линейной интерполяции.
tt <- as.numeric(colnames(prob_mat))
pos <- approx(x = tt, y = seq_along(tt), xout = time_vec, rule = 2)$y
w <- pos %% 1
t(t(prob_mat[, floor(pos)]) * (1-w) + t(prob_mat[, ceiling(pos)]) * w)
# 1.2 2.5 3.1
# id1 0.1976923 0.6566667 0.96
# id2 0.6900000 0.4766667 0.45
# id3 0.5946154 0.7500000 0.68
# id4 0.7530769 0.5633333 0.57
# id5 0.7553846 0.2200000 0.10
Примечание. rule = 2
установлен таким образом, что, когда расчетный момент времени находится за пределами интервала, используется значение ближайшего экстремума данных.