[英]Using a subscript within a for loop to store output in an array in R
我想運行具有變化的標准偏差(SD)值的仿真,並使用以下嵌套的for循環沿行存儲每個仿真結果。 我還使用用戶定義的函數QR
從量子回歸結果中提取系數。
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
我找到了一種解決方案,方法是自定義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");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.