多变量R函数的简化

多变量R函数的简化,r,R,我试图实现以下模型: 然而,我的代码是相当混乱的,因为所有的Z和我们,我正在寻找一些编码技巧,使我的代码尽可能简短和简单 model = function(N,t1,t2){ Z1 = rnorm(N,0,1) Z2 = rnorm(N,0,1) Z3 = rnorm(N,0,1) Z4 = rnorm(N,0,1) U1 = runif(N,0,1) U2 = runif(N,0,1) T = (U2+t2*U1)/(1+t2) X1 = (Z1+t1*U1)/

我试图实现以下模型:

然而,我的代码是相当混乱的,因为所有的Z和我们,我正在寻找一些编码技巧,使我的代码尽可能简短和简单

model = function(N,t1,t2){
  Z1 = rnorm(N,0,1)
  Z2 = rnorm(N,0,1)
  Z3 = rnorm(N,0,1)
  Z4 = rnorm(N,0,1)
  U1 = runif(N,0,1)
  U2 = runif(N,0,1)
  T = (U2+t2*U1)/(1+t2)
  X1 = (Z1+t1*U1)/(1+t1)
  X2= (Z2+t1*U1)/(1+t1)
  X3= (Z3+t1*U1)/(1+t1)
  X4= (Z4+t1*U1)/(1+t1)
  eps = rnorm(100,0,1)
  Y = 2*X1 + 3*T*X2 + X3*(T+1)^2+ 4*X4*sin(2*pi*T)/(2-2*sin(2*pi*T))+eps
  X = cbind(X1,X2,X3,X4)
  return(list(X = X, Y = Y))}

也许下面的代码简化了一点

model = function(N,t1,t2){
  Z <- matrix(rnorm(4*N),nrow = N)
  U <- matrix(runif(2*N),nrow = N)
  W <- tcrossprod(U, rbind(c(t2, 1))) / (1+t2)
  X <- (Z + t1*U[,1])/(1+t1)
  eps <- rnorm(N)
  M <- cbind(2,3*W,(W+1)**2,4*sin(2*pi*W)/(2-sin(2*pi*W)))
  Y <- M*X + eps
  return(list(X = X, Y = Y))
}

也许下面的代码简化了一点

model = function(N,t1,t2){
  Z <- matrix(rnorm(4*N),nrow = N)
  U <- matrix(runif(2*N),nrow = N)
  W <- tcrossprod(U, rbind(c(t2, 1))) / (1+t2)
  X <- (Z + t1*U[,1])/(1+t1)
  eps <- rnorm(N)
  M <- cbind(2,3*W,(W+1)**2,4*sin(2*pi*W)/(2-sin(2*pi*W)))
  Y <- M*X + eps
  return(list(X = X, Y = Y))
}

对于某些M,Y的表达式是否可以转换为矩阵积X%*%M?@MichaelChirico是的,这是可能的,但最好使用M*X而不是M%*%X%*%M不能满足维度一致性要求M%*%X`可能需要构造一个巨大的块矩阵并重塑乘积,这不像使用*那么简单。对于某些M,Y的表达式可以转换为矩阵乘积X%*%M吗?@MichaelChirico是的,这是可能的,但最好使用M*X而不是M%*%X%*%M不能满足维度一致性M%*%X`可能需要构造一个巨大的块矩阵并重塑产品,这不像使用它那么容易*