【发布时间】:2022-01-13 17:27:36
【问题描述】:
我目前正在使用循环解决一个问题,但有些事情告诉我,可以不这样做。我认为可行的主要原因是所有外生过程在时间 0 时都是已知的。
基本上,有两个余额,a 和 b,会随着时间的推移而耗尽。假设 1 从 800 开始,一个从 200 开始。每个时期,有两个外生过程 x 和 y。 X 耗尽余额 a 和 b 与其总余额成比例。 Y直接耗尽y直到为0,然后耗尽x。
例如,周期 1:x = 10 和 y = 5。期末a = 800 - .8 * 10 = 792, y = 200 - .2 * 10 - 5 =193。下一个时期,x 的乘数发生了变化。现在 a 为 792/985,y 为 193/995。
这是一个使用循环的非常简单的例子:
data <- data.frame(start_a = NA, start_b = NA, proportion = NA, x = runif(10, 1, 50), y = runif(10, 1, 50), end_a = NA, end_b = NA)
for (i in 1:(nrow(data))){
data$start_a[i] <- ifelse(i==1, 800, data$end_a[i-1])
data$start_b[i] <- ifelse(i==1, 200, data$end_b[i-1])
data$proportion[i] <- data$start_a[i]/(data$start_a[i] + data$start_b[i])
data$end_a[i] <- data$start_a[i] - data$proportion[i]*data$x[i] -
ifelse((data$start_b[i] - (1-data$proportion[i])*data$x[i])<= data$y[i], data$y[i] - data$start_b[i] - (1-data$proportion[i])*data$x[i], 0)
data$end_b[i] <- data$start_b[i] - (1-data$proportion[i])*data$x[i] - min(data$y[i], data$start_b[i] - (1-data$proportion[i])*data$x[i])
}
再一次,x 和 y 的完整时间历史在开始时是已知的,所以我有直觉认为不需要循环。
【问题讨论】:
-
可能不会。 data$end_ai[i] 和 data$end_b[i] 的值在循环的一个步骤中计算并用于下一步。对于矢量化,所有值必须在操作开始时已知。另外,你不应该在循环中使用
ifelse,因为它是矢量化的,而是if(...) {...} else {...}。