【问题标题】:Storing the simulated data set using list() function in R在 R 中使用 list() 函数存储模拟数据集
【发布时间】:2018-10-31 18:30:59
【问题描述】:

我正在使用以下r 代码来模拟normal 数据集。我在下面复制了它们。

set.seed(1234)
ml = matrix(c(4,2,3,5,6,8,1,4,3), nrow = 3, ncol = 3)
ml #left side of parameter
     [,1] [,2] [,3]
[1,]    4    5    1
[2,]    2    6    4
[3,]    3    8    3
mr = matrix(c(6,4,5,2,8,7,6,9,4), nrow = 3, ncol = 3)
mr #right side of parameter
     [,1] [,2] [,3]
[1,]    6    2    6
[2,]    4    8    9
[3,]    5    7    4

n = nrow(ml)

set.seed(1234)
y.all = list()
for(j in 1:ncol(ml)){
   for (i in 1:(n - 1)){
      y.all[[i]] = c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
    }
  }

sim.data = matrix(unlist(y.all), ncol(ml)*(ncol(ml) - 1)*ncol(ml), 1, byrow = TRUE)
sim.data = matrix(sim.data, nrow = ncol(ml), ncol = nrow(sim.data)/nrow(ml))
dim(sim.data)
[1] 3 6
sim.data
          [,1]     [,2]      [,3]     [,4]      [,5]     [,6]
[1,] 0.2237461 3.889715 0.2237461 3.889715 0.2237461 3.889715
[2,] 6.0644588 3.488990 6.0644588 3.488990 6.0644588 3.488990
[3,] 6.9594941 8.088805 6.9594941 8.088805 6.9594941 8.088805

我用上面的代码模拟了上面的3X6矩阵数据集。使用ml1st columnmr1st column 创建的sim.data 的第一个2 columns 等等。

但是,我通过以下方式单独检查了它们。不幸的是,它们并不相同。

set.seed(1234)
j = 1
i = 1
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 2.792934 6.277429 7.084441
i = 2
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] -0.3456977  2.4291247  4.5060559
i = 3
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 2.425260 2.453368 2.435548
set.seed(1234)
j = 2
i = 1
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 3.792934 2.277429 3.084441
i = 2
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 3.654302 6.429125 8.506056
i = 3
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 7.425260 7.453368 7.435548
set.seed(1234)
j = 3
i = 1
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] -0.2070657  6.2774292  7.0844412
i = 2
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 1.654302 4.429125 9.506056
i = 3
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 2.425260 2.453368 2.435548

我在上面的r 代码中有什么错误吗?有没有办法模拟数据集?

提前谢谢你。

【问题讨论】:

  • 我不太确定你的目标。您想以两种不同的方式模拟相同的数据集吗?为什么?
  • 我也不确定我看到的哪些问题是故意的,哪些是错误。例如,在代码的高位,您模拟y.all 中的 6 个值,然后将它们复制到一个 3x6 矩阵中。 1,2 列与sim.data 中的 3,4 列和 5,6 列相同是故意的还是错误?在您的第一个 matrix 调用中,您指定了一个 1 列矩阵,因此指定 byrow = TRUE 也没有任何作用。
  • 总的来说,我认为这两个程序都不是很清晰或有效。如果您只是将正态分布与不同的均值混合在一起,但全部使用var = 1,我建议您从标准正态中提取尽可能多的值,然后简单地将适当的均值添加到每个观察值中。
  • @Gregor,我的代码无法正常工作。为什么list() 被覆盖?我怎样才能避免这种情况?
  • 由于y.all 仅基于i 而不是ij 更新,因此当j 递增之前的y.all 值时,将被覆盖。这可能是问题的根源......

标签: r list matrix


【解决方案1】:
set.seed(1234)
y.all = list()
for(j in 1:ncol(ml)){
   for (i in 1:(n - 1)){
      y.all[[i]] = c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
    }
  }

您的 for 循环更改 ji,但您的 y.all 只查看 i,因此当 j 更改时,它会覆盖 i。最简单的解决方法是添加一个计数器:

y.all = list()
counter = 1
for(j in 1:ncol(ml)){
   for (i in 1:(n - 1)){
      y.all[[counter]] = c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
      counter = counter + 1
    }
  }

这首先会产生与您的底部方法匹配的结果。 (当您在中间再次使用 set.seed() 时,它们会出现分歧。也许您希望 set.seed 外循环??)

         [,1]       [,2]     [,3]     [,4]      [,5]     [,6]
[1,] 2.792934 -0.3456977 4.425260 5.109962 0.2237461 3.889715
[2,] 6.277429  2.4291247 1.453368 5.522807 6.0644588 3.488990
[3,] 7.084441  4.5060559 1.435548 7.001614 6.9594941 8.088805

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2023-03-27
    • 2015-09-18
    相关资源
    最近更新 更多