我被要求解决以下问题:

enter image description here

但是我很难用16组参数生成10000个样本.这就是我所做的:

library(MASS)
library(data.table)
library(Matrix)
library(stats)
set.seed(2000)
options(scipen=100)

N <- c(100, 500)
K <- c(1, 10)
ETA <- c(0.05, 1)
RHO <- c(0, 0.5)
reps <- 10000

DGP<-function(n,k,eta,rho){
  # generate D, then get \Lambda=DD', where z \sim N(0,\Lambda)
  D <- matrix(0, nrow = k, ncol = k)
  for (x in 1:k) {
    for (y in 1:k) {
      D[x, y] <- ifelse(x > y, 1, ifelse(x == y, 1, 0))
    }
  }
  # generate Z
  Z <- mvrnorm(n, mu = rep(0, k), Sigma = D%*%t(D))
  # generate error terms \epsilon, u, where y=\epsilon (since \beta-9) 
  # and u is the error term for x=z'\pi+u
  err <- mvrnorm(n, mu = rep(0, 2), Sigma = matrix(c(1, rho, rho, 1), ncol = 2))
  Y <- as.matrix(err[,1])
  u <- err[,2]
  # then we can get X
  X <- Z %*% rep(eta,k) + u
  return(data.frame(Y,X,Z))
}

# test if the DGP function works
DGP(500,1,1,0.5)

# generate the 16 samples
data<-list()

# I know this is inefficient but I gave up
para<-matrix(data=c(100,1,0.05,0,500,1,0.05,0,
     100,10,0.05,0,500,10,0.05,0,
     100,1,1,0,500,1,1,0,
     100,1,0.05,0.5,500,1,0.05,0.5,
     100,10,1,0,500,10,1,0,
     100,10,1,0.5,500,10,1,0.5,
     100,1,1,0.5,500,1,1,0.5,
     100,10,0.05,0.5,500,10,0.05,0.5),nrow=16,ncol=4,byrow=TRUE)


datalist<-function(){
  for (i in 1:16){
    df<-DGP(para[i,][1],para[i,][2],para[i,][3],para[i,][4])
    data[[i]]<-df
  }
  return(data)
}

sample<-datalist() # at least I have generated one sample

有没有办法更有效地为16组参数生成和存储10000个样本?

推荐答案

以下是一种方法:

library(MASS)

params <- expand.grid(
  n = c(100, 500),
  K = c(1, 10),
  eta = c(0.05, 1),
  rho = c(0, 0.5)
)

epsilon <- rnorm(500, 0, 1)
u <- rnorm(500, 0, 1)

Lambda <- function(K) {
  D <- matrix(0, nrow = K, ncol = K)
  D[upper.tri(D, diag = TRUE)] <- 1
  tcrossprod(D)
}

reps <- 10000
beta <- 2
sims <- function(n, K, eta, rho) {
  z <- replicate(reps, mvrnorm(n, rep(0, K), Lambda(K)))
  Omega <- diag(2)
  Omega[1, 2] <- Omega[2, 1] <- rho
  epsilon_u <- replicate(reps, mvrnorm(n, c(0, 0), Omega))
  epsilon <- epsilon_u[, 1, ]
  u <- epsilon_u[, 2, ]
  x <- eta * apply(z, 3, rowSums) + u
  y <- beta * x + epsilon
  list(x = x, y = y, z = z)
}

simulations <- vector("list", length = 16)
for(i in 1:16) {
  pars <- params[i, ]
  simulations[[i]] <- sims(pars$n, pars$K, pars$eta, pars$rho)
}

对于参数的每个组合,xn x 10000-矩阵,y也是,z是大小为(n, K, 10000)的3维array.

我不明白如果我们假设beta=0,模拟x_i的兴趣,所以我取了另一个值beta.

R相关问答推荐

按崩溃类别分类的指数

如何从其他前面列中减go 特定列的平均值?

R Markdown中的交叉引用表

如果行和大于值,则过滤

我想在R中总结一个巨大的数据框架,使我只需要唯一的lat、lon、Date(Year)和Maxium Value""""""""

如何得到R中唯一的组合群?

Ggplot2中的重复注记

在使用tidyModels和XGBoost的二进制分类机器学习任务中,所有模型都失败

TreeNode打印 twig 并为其上色

在数据帧列表上绘制GGPUP

将多个变量组合成宽格式

在纵向数据集中创建新行

循环遍历多个变量,并将每个变量插入函数R

计算使一组输入值最小化的a、b和c的值

将文本批注减少到gglot的y轴上的单个值

对R中的列表列执行ROW Mean操作

变异以按组从其他列创建具有最大和最小值的新列

将数据从一列转换为按组累计计数的单个虚拟变量

排序R矩阵的行和列

如何在GGPlot中控制多个图例和线型