簡體   English   中英

在for循環中使用下標將輸出存儲在R中的數組中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM