使用R在for循环中生成可再现的结果

问题描述 投票:0回答:1

我使用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)] 

欢呼声

r for-loop reproducible-research
1个回答
0
投票

基本上,您需要在脚本开始处设置种子,然后重新运行具有相同种子的相同脚本将产生相同的结果。示例:

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
© www.soinside.com 2019 - 2024. All rights reserved.