[R] Nested loop and output help

PIKAL Petr petr.pikal at precheza.cz
Fri Feb 1 10:01:44 CET 2013


Hi

see inline

> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
> project.org] On Behalf Of staysafe23
> Sent: Friday, February 01, 2013 1:01 AM
> To: r-help at r-project.org
> Subject: [R] Nested loop and output help
> 
> Hello Everyone,
> 
> My name is Thomas and I have been using R for one week. I recently
> found your site and have been able to search the archives of posts.
> This has given me some great information that has allowed me to craft
> an initial design to an inquiry I would like to make into the breakdown
> of McNemar's test. I have read an intro to R manual and the posting
> guides and hope I am not violating them with this post. If so I will
> re-ask my question in the proper format.
> 
> I have succeeded in writing a loop to vary one condition of my inquiry
> but I am unable to understand how to vary the remaining three
> conditions, each with its own for loop. Each time I try to do so I fail
> miserably. Here is my current code :
> 
> n <- seq(5,10,by=1)
> 
> for(i in n) {
> 
> z1 <- rnorm(n,mean=400, sd=70)
> 
> z2 <- rnorm(n,mean=450, sd=90)
> 
> cor <- runif(1,min=0.4, max=0.6)
> 
> X <- z1
> 
> Y = cor*z1+(1-cor)*z2
> 
> mat1 <- cbind(X,Y)
> 
> dev1 <- sample(-40:40, 1, replace=T)
> 
> cut1 <- mean(X) + dev1
> 
> dev2 <- sample(12:54, 1, replace=T)
> 
> cut2 <- mean(X) + dev1 + dev2
> 
> X2 <- X-cut1
> 
> Y2 <- Y-cut2
> 
> c3 <- cor(X2,Y2)
> 
> mat2 <-cbind(X2,Y2)
> 
> a11 <- ifelse( X < cut1 & Y < cut2, 1, 0)
> 
> a12 <- ifelse( X < cut1 & Y >= cut2, 1, 0)
> 
> a21 <- ifelse( X >= cut1 & Y < cut2, 1, 0)
> 
> a22 <- ifelse( X >= cut1 & Y >= cut2, 1, 0)
> 
> mat3 <-matrix(c(sum(a11),sum(a21), sum(a12),sum(a22)), nrow = 2)
> 
> mat4 <-matrix(c(sum(a11),sum(a22), sum(a12),sum(a21)), nrow = 2)
> 
> out3a <- mcnemar.test(mat3, correct=FALSE)
> 
> out3b <- mcnemar.test(mat3, correct=TRUE)
> 
> out4a <- chisq.test(mat4, correct = FALSE)
> 
> out4b <- chisq.test(mat4, correct = TRUE)
> 
> print(mat1)
> 
> print(mat2)
> 
> print(cut1)
> 
> print(cut2)
> 
> print(mat3)
> 
> print(out3a)
> 
> print(out3b)
> 
> print(mat4)
> 
> print(out4a)
> 
> print(out4b)
> 
> }
> 
> .

Use list structure for keeping such results.

lll<-list()
for(j in 1:5) {
lll[[j]] <- list()
for( i in 1:3) lll[[j]][[i]]<-rnorm(10)
}

after population of a list you can print it as a whole or only part. Here is an example with your code.

n <- seq(5,10,by=1)

lll <- vector(mode = "list", length = 10)
names(lll) <- c("mat1", "mat2", "mat3", "mat4", "cut1", "cut2", "out3a", "out3b", "out4a", "out4b")

n <- seq(5,10,by=1)

for(i in n) {
z1 <- rnorm(n,mean=400, sd=70)
z2 <- rnorm(n,mean=450, sd=90)
cor <- runif(1,min=0.4, max=0.6)
X <- z1
Y = cor*z1+(1-cor)*z2

lll[["mat1"]] <- cbind(X,Y)
dev1 <- sample(-40:40, 1, replace=T)

lll[["cut1"]] <- mean(X) + dev1
dev2 <- sample(12:54, 1, replace=T)

lll[["cut2"]] <- mean(X) + dev1 + dev2
X2 <- X-cut1
Y2 <- Y-cut2
c3 <- cor(X2,Y2)

lll[["mat2"]] <-cbind(X2,Y2)
a11 <- ifelse( X < cut1 & Y < cut2, 1, 0)
a12 <- ifelse( X < cut1 & Y >= cut2, 1, 0)
a21 <- ifelse( X >= cut1 & Y < cut2, 1, 0)
a22 <- ifelse( X >= cut1 & Y >= cut2, 1, 0)

lll[["mat3"]] <-matrix(c(sum(a11),sum(a21), sum(a12),sum(a22)), nrow = 2)
lll[["mat4"]] <-matrix(c(sum(a11),sum(a22), sum(a12),sum(a21)), nrow = 2)
lll[["out3a"]] <- mcnemar.test(mat3, correct=FALSE)
lll[["out3b"]] <- mcnemar.test(mat3, correct=TRUE)
lll[["out4a"]] <- chisq.test(mat4, correct = FALSE)
lll[["out4b"]] <- chisq.test(mat4, correct = TRUE)
}

print(lll)

> 
> Other than the sample size of the random draws I would like to nest for
> loops for cor, dev1, and dev2 according to the following sequences
> respectively:
> 
> cor <- seq(-0.5,0.5, by=0.25)

do not use floating points in cycle.

better to use

for (k in 1:n) {
cc <- cor[k]
make computation with cc
}


> 
> dev1 <- seq(-100,100, by=10)
> 
> dev2 <- seq(12,54, by=10)
> 
> .
> 
> After doing so I would like to put each matrix and their respective
> tests into a text file so that I can examine the results. I would like
> to put the results in a .txt file each time the loop finishes one case.
> I would like to append this text file with subsequent matrices and
> results rendered by each iteration of the nested for loop.  I have seen
> some very nice examples of output that R can render. I would like to
> simply display each matrix and their tests.

maybe R2HTML or latex in Hmisc package can 

Regards 
Petr

> 
> Thank you to all the teachers and students on this forum. The only
> reason I have been able to craft this inquiry is due to the questions
> and answers I have found through searching the archive. Thank you
> kindly for your assistance and for freely sharing your knowledge.
> 
> Best wishes,
> Thomas
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-
> guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list