每次都以不同的标准偏差复制

时间:2013-12-02 11:20:09

标签: r

我有一个标准差的向量:

sd_vec<-runif(10,0,20),其中10个值介于0到20之间。

[1] 11.658106  9.693493 12.695608  4.091922  5.761061 18.410951 14.710990 12.095944 18.023123
[10] 13.294963

我想复制以下过程:

a<-rnorm(10,0,30)
[1] -21.265083  85.557147  23.958170 -32.843328   6.629831 -23.745339  46.094324  51.020059
[9]   1.041724  13.757235

n_columns=50
replicate(n_columns, a+rnorm(length(a), mean=0,sd=sd_vec))

结果应为10列,每列为:

column 1: a + rnorm(length(a),0,11.658106)
column 2: a + rnorm(length(a),0,9.693493)
column 3: a + rnorm(length(a),0,12.695608)
.
.
.
column 10:a + rnorm(length(a),0,13.294963)

这会为每个复制使用不同的sd_vec值,还是会为每个随机数生成使用它?

2 个答案:

答案 0 :(得分:2)

根据您的编辑,您可能想尝试

 a+sapply(sd_vec, rnorm, n=100, mean=0)

# example
> set.seed(1)
> sd_vec <-runif(10,0,20)
> set.seed(1)  
> a<-rnorm(100,0,30)
> n_columns=10 
> head(a+sapply(sd_vec, rnorm, n=100, mean=0))
           [,1]       [,2]      [,3]        [,4]       [,5]       [,6]      [,7]       [,8]       [,9]
[1,] -22.087869 -15.746650 -8.554735   0.7226986 -18.481801 -24.921835 -32.16206 -33.158153 -38.187974
[2,]   5.732942  18.078702 -6.489666  39.9422684   4.311839  32.504554  42.75921 -18.624133   7.954302
[3,] -29.906010 -13.260709 -2.483113 -36.0217953 -29.841630 -15.576334 -26.76925 -11.915258 -21.741820
[4,]  48.697584  45.395650 43.463125  40.7586401  47.903975  57.600406  47.59359  47.701659  33.782184
[5,]   6.409275  -7.122582 28.836887   2.3249113  13.884993   7.429514 -11.34081   1.960571  18.075706
[6,] -15.229450  -6.025260 -7.288529 -31.4375515 -18.184563 -45.038651 -50.00938 -26.965804 -37.610292
          [,10]
[1,] -17.391109
[2,]   6.883342
[3,] -26.144900
[4,]  48.118830
[5,]   9.970987
[6,] -26.668629

答案 1 :(得分:1)

您当前的解决方案将为每次复制复制sd_vec,而不是为每次复制使用每个sd。

如果你想为每个sd提供列,那么你可以使用矩阵。通过以下方式创建rnorm矩阵,希望sd:

X <- rnorm(length(a)*n_columns, mean=0, sd=sd_vec)
X <- matrix(X, nrow=length(a), ncol=n_columns, byrow=TRUE)

然后将其添加到转换为矩阵的a

matrix(a, nrow=length(a), ncol=n_columns) + X