我想运行具有不同标准偏差(SD)值的模拟,并使用以下嵌套for循环将每个模拟结果存储在行中。我还使用用户定义的函数QR
从Quanile回归的结果中提取系数。
QR <- function(varname, data){
y <- data[, varname]
q <- summary(rq(y ~ x, taus), se = "boot")
z <- rbind(q[[1]]$coef, q[[2]]$coef, q[[3]]$coef, q[[4]]$coef)
}
taus <- c(.05, .1, .25, .75, .90, .95) # Quantiles to be extracted
nsim <- 10 # No of simulations
SD <- c(1, 3, 5) # Varying SD
res <- array(NA, dim = c(nsim, 10, 3)) # Empty array to store the results
for (i in 1:3){
for (j in 1:nsim){
x <- rnorm(SS[i], 10, 1);
eN <- rnorm(SS[i], 0, 1);
eLN1 <- rlnorm(SS[i], 0, 0.25);
data <- data.frame(cbind(y1 <- 1 + (2 * x) + eN,
y2 <- 1 + (2 * x) + eLN1,
x))
colnames(data) <- c("y1", "y2", "x")
listQR <- lapply(names(data)[1:2], function(x) QR(x, data))
res[j, 1, i] <- SS[i];
res[j, 2, i] <- SS[j];
res[j, 3, i] <- listQR[[1]][1, 1];
res[j, 4, i] <- listQR[[1]][1, 2];
res[j, 5, i] <- listQR[[1]][2, 1];
res[j, 6, i] <- listQR[[1]][2, 2];
res[j, 7, i] <- listQR[[2]][1, 1];
res[j, 8, i] <- listQR[[2]][1, 2];
res[j, 9, i] <- listQR[[2]][2, 1];
res[j, 10, i] <- listQR[[2]][2, 2];
write.csv(res, file = "test.csv");
}
}
我还要从listQR
中提取其他几个值,并以相同的方式存储它,在这种情况下,我必须为它们编写其他几行代码。我的问题是,我可以在循环中使用一些下标listQR
/修改代码,这样我最终会编写较少的代码行吗?像,
res[j, k, i] <- listQR[[k]] # Tried this, end up overwriting the values
答案 0 :(得分:0)
我通过自定义QR函数找到了一个解决方案,以矩阵格式给出相关系数,而不是在循环中提取它们。我使用了以下代码。
QR <- function(varname, data){
y<-data[,varname]
q<-summary(rq(y~x, taus),se="boot")
z<-cbind(q[[1]]$coef[1,1], q[[2]]$coef[1,1],
q[[3]]$coef[1,1], q[[4]]$coef[1,1])
return(z)
}
taus <- c(.05,.1,.25,.75,.90,.95)
nsim<-10
SD<-c(1,3,5)
res<-array(NA,dim=c(nsim,10,3))
for (i in 1:3){
for (j in 1:nsim){
x<-rnorm(50,10,SD[i]); eN<-rnorm(50,0,SD[i]); eLN1<-rlnorm(50,0,SD[i]);
data<-data.frame(cbind(y1<-1+(2*x)+eN, y2<-1+(2*x)+eLN1, x))
colnames(data)<-c("y1", "y2","x")
listQR<-lapply(names(data)[1:2], function(x) QR(x, data))
write.csv(res, file="test.csv");
}
}