使用for循环中的下标将输出存储在R中的数组中

时间:2017-05-29 04:49:45

标签: arrays r

我想运行具有不同标准偏差(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

1 个答案:

答案 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");
}
}