【问题标题】:Creating a matrix from using a nested for loop in R在 R 中使用嵌套的 for 循环创建矩阵
【发布时间】:2018-05-31 16:46:09
【问题描述】:

我正在尝试做的事情的概述: 我目前正在使用我设法在 R 中编写的特定函数来模拟股票价格:

for(i in 2:252){
  X[1]<- 83.26
  X[i] <- X[i-1]*(1+mu*dt)+sigma*X[i-1]*sqrt(dt)*rnorm(1)}

我正在模拟 252 天以生成一条轨迹。以上工作完美。

我现在需要使用上述代码生成 100 条轨迹,并被告知围绕上述代码添加一个额外的 for 循环,以便生成 100 条轨迹并将结果保存在矩阵中。

到目前为止我有:

Y<- matrix(NA, nrow=100, ncol=252)
for(j in 1:dim(X)[1]){

  for(i in 2:dim(X)[2]){
    X[1]<- 83.26
    X[i] <- X[i-1]*(1+mu*dt)+sigma*X[i-1]*sqrt(dt)*rnorm(1)}
}

这不起作用也不做任何事情。

基本上我想要做的是创建一个包含 252 列(代表不同股票价格的日子)和 100 行(代表 100 条不同生成路径)的矩阵

任何有关如何执行此操作的帮助将不胜感激。

mu=0.0009646
sigma=0.0001471
dt=0.00796813

编辑:

我现在需要能够将矩阵的每一行创建为图表上的单独线。 IE。绘制每个轨迹与时间 t 的关系。

【问题讨论】:

  • 你应该使用replicate函数
  • 您也可以考虑一次生成 25,200 个 rnorm 绘制,而不是重复调用 rnorm(这比只调用一次要慢)
  • 您也应该向我们提供您正在使用的 musigmadt 的值 :)

标签: r for-loop matrix row nested-loops


【解决方案1】:

对 Brett 的解决方案进行反复讨论,

Y<- matrix(NA, nrow=100, ncol=252)
for(j in 1:dim(Y)[1]){
  for(i in 2:dim(Y)[2]){
  X[1]<- 83.26
  X[i] <- X[i-1]*(1+mu*dt)+sigma*X[i-1]*sqrt(dt)*rnorm(1)}
Y[j, ] <- X
}

您遇到的一个问题是要求 R 计算 dim(X),这似乎是给定您的第一个代码块,就像它应该是一个向量,因此有一个 length() 但不是 dim()

因此,此解决方案使用您的矩阵 Y 来生成您用于迭代的维度。

另一个问题是在您每次迭代 X 252 次之后,您并没有存储这些值。因此,当您输入Y[j, ] &lt;- X 时,您会获取为X 创建的所有值并将它们存储在j 的第Y 行中。

我相信其他人会加入更巧妙的解决方案,但这个使用了您已经编写的大部分代码。

干杯。

【讨论】:

    【解决方案2】:
    mu <- 0.0009646
    sigma <- 0.0001471
    dt <- 0.00796813
    
    X <- matrix(NA, nrow = 100, ncol = 252)
    
    for (j in 1:dim(X)[2]) {
      X[1, j] <- 83.26
      for (i in 2:dim(X)[1]) {
        X[i, j] <-
          X[i - 1, j] * (1 + mu * dt) + sigma * X[i - 1, j] * sqrt(dt) * rnorm(1)
      }
    }
    

    i 是单独的日子,j 是单独的轨迹,所以每一列都是轨迹,其中行是不同的日子。

    一种绘制数据的方法:

    library(ggplot2)
    library(reshape2)
    
    X <- data.frame(X)
    X$day <- 1:NROW(X)
    
    X_melt <- melt(X, id.vars = "day")
    
    ggplot(data = X_melt, aes(x = day, y = value, group = variable)) +
      geom_line()
    

    每一行都是不同的轨迹

    【讨论】:

    • 我现在的问题是尝试将行绘制为线,如果您知道该怎么做吗?谢谢
    • 你可以使用t(X)转置矩阵
    猜你喜欢
    • 1970-01-01
    • 2020-07-20
    • 2021-08-17
    • 2019-12-28
    • 1970-01-01
    • 2020-05-25
    • 2014-09-03
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多