简体   繁体   中英

How to generate this R function for random effect model?

I'm trying to create a code such that Y = 5g1(X1) + 3g2(X2) + 4g3(X3) + 6g4(X4) + sqrt(1.74)*eps (the functions g, are defined in the code).

X = (X1,...,Xp) should be an nxp dimensional design matrix, however I'm not sure about how to generate that based on this information where Xj = W+U is simulated according to a random effects model. I tried using X = do.call(cbind, replicate(p, X, simplify=FALSE)) but this just replicates each Xj, i'm not sure that's what should be done, they should be different.

Any advice on what i have missed would be appreciated and any improvements on the code too to make it more concise.

n<- 400
p<- 1000
W = runif(n)
U = runif(n)
eps = rnorm(n)

for (j in 1:p){
   X = W+U
   X = as.matrix(X)
return(X)} #This is a nx1 matrix... 
#alternatively write: X = do.call(cbind, replicate(p, X, simplify=FALSE)) 

g1 = X 
g2 = (2*X-1)^2
g3 = sin(2*pi*X)/(2-sin(2*pi*X))
g4 = 0.1*sin(2*pi*X) + 0.2*cos(2*pi*X) + 0.3*sin(2*pi*X)^2 + 0.4*cos(2*pi*X)^3 + 0.5*sin(2*pi*X)^3

Y = 5*g1 + 3*g2 + 4*g3 + 6*g4 + sqrt(1.74)*eps
return(Y)
}

I am not sure to capture the logic of your calculation, eventually it is something like this:

n <- 40 # 400
p <- 100 # 1000

X <- replicate(p, runif(n) + runif(n))  ## W+U

y <- function(X) {
  g1 <- X 
  g2 <- (2*X-1)^2
  g3 <- sin(2*pi*X)/(2-sin(2*pi*X))
  g4 <- 0.1*sin(2*pi*X) + 0.2*cos(2*pi*X) + 0.3*sin(2*pi*X)^2 + 0.4*cos(2*pi*X)^3 + 0.5*sin(2*pi*X)^3
  eps <- rnorm(length(X))
  Y <- 5*g1 + 3*g2 + 4*g3 + 6*g4 + sqrt(1.74)*eps
  return(Y)
}

Y <- apply(X, 2, FUN=y)

Also the variant without apply() works:

Y <- y(X)

To compare both variants:

set.seed(42)
Y1 <- apply(X, 2, FUN=y)

set.seed(42)
Y2 <- y(X)

identical(Y1, Y2)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM