使用 R 在 for 循环中生成可重现的结果
Generate Reproducible Results in for loop using R
我使用 R 中的 for 循环创建了两个数据框(3 列,每列有 6000 个观察值)和随机生成的变量。之后的结果必须是可重现的。我尝试执行 set.seed 命令但到目前为止失败了。知道如何解决这个问题吗?任何帮助将不胜感激。
这是代码,它真的很长而且可能很乱,因为我不经常使用 R。
# -------------------------------------
# Initialize Dataframes
# -------------------------------------
price_1 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
demandChartist_1 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
demandFundamentalist_1 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
percentFT_Wf_1 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
percentCT_Wc_1 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
fitnessTradingFundamentalist_Af_1 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
fitnessTradingChartist_Ac_1 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
#Market2
price_2 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
demandChartist_2 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
demandFundamentalist_2 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
percentFT_Wf_2 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
percentCT_Wc_2 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
fitnessTradingFundamentalist_Af_2 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
fitnessTradingChartist_Ac_2 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
percentNoTrading <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
T <- as.data.frame(1:6002)
# -------------------------------------
# Set-Up Start-Values
# -------------------------------------
# set the first 4 values equal to 0, 1 whatever otherwise we can't compute the previous periods
price_1[1:4, 1] <- 0
price_2[1:4, 1] <- 0
fitnessTradingChartist_Ac_1[1:3, 1] <- 0
fitnessTradingFundamentalist_Af_1[1:3, 1] <- 0
fitnessTradingChartist_Ac_2[1:3, 1] <- 0
fitnessTradingFundamentalist_Af_2[1:3,1] <- 0
a <- 1
b <- 0.05
c <- 0.05
d <- 0.975
e <- 300
F1 <- 0
F2 <- 0
# -------------------------------------
# Value Calculation via looping through it (forward Euler)
# -------------------------------------
for(j in 1:1)
{
for (i in 4:6002) {
demandChartist_1[i-2,j] =
b * (price_1[i-2,j] - price_1[i-3,j]) +
rnorm(1, mean=0, sd=0.05)
# [i-2] weil fitness tradingFundamentalist der jetzigen Periode Demand der Periode t-2 also 2 erfordert.
demandChartist_2[i-2,j] =
b * (price_2[i-2,j] - price_2[i-3,j]) +
rnorm(1, mean=0, sd=0.05)
print("1 OK")
demandFundamentalist_1[i-2,j] =
c * (F1 - price_1[i-2,j]) + rnorm(1, mean=0, sd=0.01)
demandFundamentalist_2[i-2,j] =
c * (F2 - price_2[i-2,j]) + rnorm(1, mean=0, sd=0.01)
fitnessTradingChartist_Ac_1[i,j] =
(exp(price_1[i,j]) - exp(price_1[i-1,j])) *
demandChartist_1[i-2,j] +
d * fitnessTradingChartist_Ac_1[i-1,j]
fitnessTradingChartist_Ac_2[i,j] =
(exp(price_2[i,j]) - exp(price_2[i-1,j])) *
demandChartist_2[i-2,j] +
d * fitnessTradingChartist_Ac_2[i-1,j]
fitnessTradingFundamentalist_Af_1[i,j] =
(exp(price_1[i,j]) - exp(price_1[i-1,j])) *
demandFundamentalist_1[i-2,j] +
d * fitnessTradingChartist_Ac_1[i-1,j]
fitnessTradingFundamentalist_Af_2[i,j] =
(exp(price_2[i,j]) - exp(price_2[i-1,j])) *
demandFundamentalist_2[i-2,j] +
d * fitnessTradingChartist_Ac_2[i-1,j]
percentCT_Wc_1[i,j] =
exp(e * fitnessTradingChartist_Ac_1[i,j]) /
(
exp(e * fitnessTradingChartist_Ac_1[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_1[i,j]) +
exp(e * fitnessTradingChartist_Ac_2[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_2[i,j]) +
exp(0)
)
percentCT_Wc_2[i,j] =
exp(e * fitnessTradingChartist_Ac_2[i,j]) /
(
exp(e * fitnessTradingChartist_Ac_1[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_1[i,j]) +
exp(e * fitnessTradingChartist_Ac_2[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_2[i,j]) +
exp(0)
)
percentFT_Wf_1[i,j] =
exp(e * fitnessTradingFundamentalist_Af_1[i,j]) /
(
exp(e * fitnessTradingChartist_Ac_1[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_1[i,j]) +
exp(e * fitnessTradingChartist_Ac_2[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_2[i,j]) +
exp(0)
)
percentFT_Wf_2[i,j] =
exp(e * fitnessTradingFundamentalist_Af_2[i,j]) /
(
exp(e * fitnessTradingChartist_Ac_1[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_1[i,j]) +
exp(e * fitnessTradingChartist_Ac_2[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_2[i,j]) +
exp(0)
)
percentNoTrading[i,j] =
1 - percentCT_Wc_1[i,j] - percentFT_Wf_1[i,j] -
percentCT_Wc_2[i,j] - percentFT_Wf_2[i,j]
price_1[i,j] =
price_1[i-1,j] +
a *
(
(percentCT_Wc_1[i-1,j] * demandChartist_1[i-1,j] +
percentFT_Wf_1[i-1,j] * demandFundamentalist_1[i-1,j]
)
) +
rnorm(1, mean=0, sd=0.01)
price_2[i,j] =
price_2[i-1,j] +
a *
(
(percentCT_Wc_2[i-1,j] * demandChartist_2[i-1,j] +
percentFT_Wf_2[i-1,j] * demandFundamentalist_2[i-1,j]
)
) +
rnorm(1, mean=0, sd=0.01)
}
}
# -------------------------------------
# CLEANING|REAARANGING|RENAMING DATA-FRAMES
# -------------------------------------
# Final Dataframe for Market 1
main_dfM1 <- data.frame(T, price_1,
demandChartist_1,
demandFundamentalist_1,
fitnessTradingChartist_Ac_1,
fitnessTradingFundamentalist_Af_1,
percentCT_Wc_1,
percentFT_Wf_1,
percentNoTrading
)
colnames(main_dfM1)[1:9] <- c("Time","Price_1", "demandChartist_1",
"demandFundamentalist_1",
"fitnessTradingChartist_Ac_1",
"fitnessTradingFundamentalist_Af_1",
"percentCT_Wc_1,", "percentFT_Wf_1",
"percentNoTrading")
# Calculate Returns from Prices in Market 1
main_dfM1$Return_1 <- lead(main_dfM1$Price_1, 1) - main_dfM1$Price_1
# Rearrange Columns in Dataframe
main_dfM1 <- main_dfM1[ ,c(1:2,10, 3:9)]
# Final Dataframe for Market 2
main_dfM2 <- data.frame(T, price_2,
demandChartist_2,
demandFundamentalist_2,
fitnessTradingChartist_Ac_2,
fitnessTradingFundamentalist_Af_2,
percentCT_Wc_2,
percentFT_Wf_2,
percentNoTrading
)
colnames(main_dfM2)[1:9] <- c("Time","Price_2", "demandChartist_2",
"demandFundamentalist_2",
"fitnessTradingChartist_Ac_2",
"fitnessTradingFundamentalist_Af_2",
"percentCT_Wc_2,", "percentFT_Wf_2",
"percentNoTrading")
# Calculate Returns from Prices in Market 2
main_dfM2$Return_2 <- lead(main_dfM2$Price_2, 1) - main_dfM2$Price_2
# Rearrange Columns in Dataframe
main_dfM2 <- main_dfM2[ ,c(1:2,10, 3:9)]
干杯
基本上您需要在脚本开始时设置种子,然后对具有相同种子的相同脚本的任何重新 运行 都会产生相同的结果。示例:
set.seed(12)
mat1 <- matrix(rnorm(100000),1000,100)
mat2 <- matrix(rnorm(100000),1000,100)
set.seed(12)
mat3 <- matrix(rnorm(100000),1000,100)
mat4 <- matrix(rnorm(100000),1000,100)
all(mat1==mat2)
#False
all(mat1==mat3)
#True
all(mat2==mat4)
#True
我使用 R 中的 for 循环创建了两个数据框(3 列,每列有 6000 个观察值)和随机生成的变量。之后的结果必须是可重现的。我尝试执行 set.seed 命令但到目前为止失败了。知道如何解决这个问题吗?任何帮助将不胜感激。
这是代码,它真的很长而且可能很乱,因为我不经常使用 R。
# -------------------------------------
# Initialize Dataframes
# -------------------------------------
price_1 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
demandChartist_1 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
demandFundamentalist_1 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
percentFT_Wf_1 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
percentCT_Wc_1 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
fitnessTradingFundamentalist_Af_1 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
fitnessTradingChartist_Ac_1 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
#Market2
price_2 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
demandChartist_2 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
demandFundamentalist_2 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
percentFT_Wf_2 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
percentCT_Wc_2 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
fitnessTradingFundamentalist_Af_2 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
fitnessTradingChartist_Ac_2 <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
percentNoTrading <- as.data.frame(matrix(ncol = 1, nrow =6002, 0L))
T <- as.data.frame(1:6002)
# -------------------------------------
# Set-Up Start-Values
# -------------------------------------
# set the first 4 values equal to 0, 1 whatever otherwise we can't compute the previous periods
price_1[1:4, 1] <- 0
price_2[1:4, 1] <- 0
fitnessTradingChartist_Ac_1[1:3, 1] <- 0
fitnessTradingFundamentalist_Af_1[1:3, 1] <- 0
fitnessTradingChartist_Ac_2[1:3, 1] <- 0
fitnessTradingFundamentalist_Af_2[1:3,1] <- 0
a <- 1
b <- 0.05
c <- 0.05
d <- 0.975
e <- 300
F1 <- 0
F2 <- 0
# -------------------------------------
# Value Calculation via looping through it (forward Euler)
# -------------------------------------
for(j in 1:1)
{
for (i in 4:6002) {
demandChartist_1[i-2,j] =
b * (price_1[i-2,j] - price_1[i-3,j]) +
rnorm(1, mean=0, sd=0.05)
# [i-2] weil fitness tradingFundamentalist der jetzigen Periode Demand der Periode t-2 also 2 erfordert.
demandChartist_2[i-2,j] =
b * (price_2[i-2,j] - price_2[i-3,j]) +
rnorm(1, mean=0, sd=0.05)
print("1 OK")
demandFundamentalist_1[i-2,j] =
c * (F1 - price_1[i-2,j]) + rnorm(1, mean=0, sd=0.01)
demandFundamentalist_2[i-2,j] =
c * (F2 - price_2[i-2,j]) + rnorm(1, mean=0, sd=0.01)
fitnessTradingChartist_Ac_1[i,j] =
(exp(price_1[i,j]) - exp(price_1[i-1,j])) *
demandChartist_1[i-2,j] +
d * fitnessTradingChartist_Ac_1[i-1,j]
fitnessTradingChartist_Ac_2[i,j] =
(exp(price_2[i,j]) - exp(price_2[i-1,j])) *
demandChartist_2[i-2,j] +
d * fitnessTradingChartist_Ac_2[i-1,j]
fitnessTradingFundamentalist_Af_1[i,j] =
(exp(price_1[i,j]) - exp(price_1[i-1,j])) *
demandFundamentalist_1[i-2,j] +
d * fitnessTradingChartist_Ac_1[i-1,j]
fitnessTradingFundamentalist_Af_2[i,j] =
(exp(price_2[i,j]) - exp(price_2[i-1,j])) *
demandFundamentalist_2[i-2,j] +
d * fitnessTradingChartist_Ac_2[i-1,j]
percentCT_Wc_1[i,j] =
exp(e * fitnessTradingChartist_Ac_1[i,j]) /
(
exp(e * fitnessTradingChartist_Ac_1[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_1[i,j]) +
exp(e * fitnessTradingChartist_Ac_2[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_2[i,j]) +
exp(0)
)
percentCT_Wc_2[i,j] =
exp(e * fitnessTradingChartist_Ac_2[i,j]) /
(
exp(e * fitnessTradingChartist_Ac_1[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_1[i,j]) +
exp(e * fitnessTradingChartist_Ac_2[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_2[i,j]) +
exp(0)
)
percentFT_Wf_1[i,j] =
exp(e * fitnessTradingFundamentalist_Af_1[i,j]) /
(
exp(e * fitnessTradingChartist_Ac_1[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_1[i,j]) +
exp(e * fitnessTradingChartist_Ac_2[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_2[i,j]) +
exp(0)
)
percentFT_Wf_2[i,j] =
exp(e * fitnessTradingFundamentalist_Af_2[i,j]) /
(
exp(e * fitnessTradingChartist_Ac_1[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_1[i,j]) +
exp(e * fitnessTradingChartist_Ac_2[i,j]) +
exp(e * fitnessTradingFundamentalist_Af_2[i,j]) +
exp(0)
)
percentNoTrading[i,j] =
1 - percentCT_Wc_1[i,j] - percentFT_Wf_1[i,j] -
percentCT_Wc_2[i,j] - percentFT_Wf_2[i,j]
price_1[i,j] =
price_1[i-1,j] +
a *
(
(percentCT_Wc_1[i-1,j] * demandChartist_1[i-1,j] +
percentFT_Wf_1[i-1,j] * demandFundamentalist_1[i-1,j]
)
) +
rnorm(1, mean=0, sd=0.01)
price_2[i,j] =
price_2[i-1,j] +
a *
(
(percentCT_Wc_2[i-1,j] * demandChartist_2[i-1,j] +
percentFT_Wf_2[i-1,j] * demandFundamentalist_2[i-1,j]
)
) +
rnorm(1, mean=0, sd=0.01)
}
}
# -------------------------------------
# CLEANING|REAARANGING|RENAMING DATA-FRAMES
# -------------------------------------
# Final Dataframe for Market 1
main_dfM1 <- data.frame(T, price_1,
demandChartist_1,
demandFundamentalist_1,
fitnessTradingChartist_Ac_1,
fitnessTradingFundamentalist_Af_1,
percentCT_Wc_1,
percentFT_Wf_1,
percentNoTrading
)
colnames(main_dfM1)[1:9] <- c("Time","Price_1", "demandChartist_1",
"demandFundamentalist_1",
"fitnessTradingChartist_Ac_1",
"fitnessTradingFundamentalist_Af_1",
"percentCT_Wc_1,", "percentFT_Wf_1",
"percentNoTrading")
# Calculate Returns from Prices in Market 1
main_dfM1$Return_1 <- lead(main_dfM1$Price_1, 1) - main_dfM1$Price_1
# Rearrange Columns in Dataframe
main_dfM1 <- main_dfM1[ ,c(1:2,10, 3:9)]
# Final Dataframe for Market 2
main_dfM2 <- data.frame(T, price_2,
demandChartist_2,
demandFundamentalist_2,
fitnessTradingChartist_Ac_2,
fitnessTradingFundamentalist_Af_2,
percentCT_Wc_2,
percentFT_Wf_2,
percentNoTrading
)
colnames(main_dfM2)[1:9] <- c("Time","Price_2", "demandChartist_2",
"demandFundamentalist_2",
"fitnessTradingChartist_Ac_2",
"fitnessTradingFundamentalist_Af_2",
"percentCT_Wc_2,", "percentFT_Wf_2",
"percentNoTrading")
# Calculate Returns from Prices in Market 2
main_dfM2$Return_2 <- lead(main_dfM2$Price_2, 1) - main_dfM2$Price_2
# Rearrange Columns in Dataframe
main_dfM2 <- main_dfM2[ ,c(1:2,10, 3:9)]
干杯
基本上您需要在脚本开始时设置种子,然后对具有相同种子的相同脚本的任何重新 运行 都会产生相同的结果。示例:
set.seed(12)
mat1 <- matrix(rnorm(100000),1000,100)
mat2 <- matrix(rnorm(100000),1000,100)
set.seed(12)
mat3 <- matrix(rnorm(100000),1000,100)
mat4 <- matrix(rnorm(100000),1000,100)
all(mat1==mat2)
#False
all(mat1==mat3)
#True
all(mat2==mat4)
#True