Hi
You must use indexing based on loops
sim(ss[i],cc[j],oo1[k],oo2[l])
an of course assign result to some object.
result[...] <- sim(ss[i],cc[j],oo1[k],oo2[l])
where ... means some suitable index either chosen from loop index or constructed
during loop execution.
Maybe it is time to go through R intro document (chapter 2 and chapter 9).
You probably could find answer yourself quicker then waiting for me to answer
it.
Regards
Petr
From: staysafe23 [mailto:staysafe23@gmail.com]
Sent: Thursday, February 07, 2013 9:09 PM
To: PIKAL Petr
Subject: RE: [R] Nested loop and output help
Hi Petr,
I have refined my question and would like to ask it another way if I may. Here
are the conditions I would like to vary in my inquiry.
ss <- seq(5,9,by=1) 5 6 7 8 9
cc <- seq(-0.5,0.5, by=0.25) -0.50 -0.25 0.00 0.25 0.50
oo1 <- seq(-10,10, by=5) -10 -5 0 5 10
oo2 <- seq(0,20, by=5) 0 5 10 15 20
Here is the loop I would like to run.
for(i in ss) {
for (j in cc) {
for (k in oo1) {
for (l in oo2) {
sim(ss,cc,oo1,oo2)
}
}
}
}
There are the results that would like to get.
sim(5,-0.5,-10,0)
sim(5,-0.5,-10,5)
sim(5,-0.5,-10,10)
sim(5,-0.5,-10,15)
sim(5,-0.5,-10,20)
. . .
. . .
. . .
sim(9,0.5,10,0)
sim(9,0.5,10,5)
sim(9,0.5,10,10)
sim(9,0.5,10,15)
sim(9,0.5,10,20)
Here is my function but I am not getting the loop to run over all the possible
permutations of the conditions nor and I getting an output for each condition.
sim <- function(ss,cc,oo1,oo2) {
lll <- vector(mode = "list", length = 16)
names(lll) <- c("og_table", "McNemar",
"McNemar_corr",
"sd_table", "Chisq", "Chisq_corr",
"og_data", "mean_X", "cut_T1",
"mean_X2",
"mean_Y","cut_T2", "mean_Y2",
"dev_data", "sum_D", "sum_D2")
z1 <- rnorm(ss,mean=400, sd=70)
z2 <- rnorm(ss,mean=450, sd=90)
r <- cc
X <- z1
Y = r*z1+(1-r)*z2
lll[["og_data"]] <- cbind(X,Y)
dev1 <- oo1
lll[["cut_T1"]] <- mean(X) + dev1
dev2 <- oo2
lll[["cut_T2"]] <- mean(X) + dev1 + dev2
X2 <- X-lll[["cut_T1"]]
Y2 <- Y-lll[["cut_T2"]]
c3 <- cor(X2,Y2)
D <- Y2-X2
lll[["sum_D"]] <- sum(D)
D2 <-D*D
lll[["sum_D2"]] <- sum(D2)
lll[["dev_data"]] <-cbind(X2,Y2)
a11 <- ifelse( X < lll[["cut_T1"]] & Y <
lll[["cut_T2"]], 1, 0)
a12 <- ifelse( X < lll[["cut_T1"]] & Y >=
lll[["cut_T2"]], 1, 0)
a21 <- ifelse( X >= lll[["cut_T1"]] & Y <
lll[["cut_T2"]], 1, 0)
a22 <- ifelse( X >= lll[["cut_T1"]] & Y >=
lll[["cut_T2"]], 1, 0)
lll[["og_table"]] <-matrix(c(sum(a11),sum(a21), sum(a12),sum(a22)),
nrow = 2)
lll[["McNemar"]] <-mcnemar.test(lll[["og_table"]],
correct=FALSE)
lll[["McNemar_corr"]] <-mcnemar.test(lll[["og_table"]],
correct=TRUE)
lll[["sd_table"]] <-matrix(c(sum(a11),sum(a22), sum(a12),sum(a21)),
nrow = 2)
lll[["Chisq"]] <-chisq.test(lll[["sd_table"]], correct =
FALSE)
lll[["Chisq_corr"]] <-chisq.test(lll[["sd_table"]],
correct = TRUE)
lll[["mean_X"]] <- mean(X)
lll[["mean_Y"]] <- mean(Y)
lll[["mean_X2"]] <- mean(X2)
lll[["mean_Y2"]] <- mean(Y2)
lll[["T"]] <-
sum(D)/((length(D)*sum(D2)-sum(D)*sum(D))/(length(D)-1))**(0.5)
lll[["dep_t"]] <- t.test(Y2, X2, alternative='two.sided',
conf.level=0.95, paired=TRUE)
print(lll)
capture.output(print(lll), file =
"C:/Chi_Square_fix/temp_[ss]_[cc]_[oo1]_[002].txt", append = TRUE)
}
On Feb 6, 2013 3:26 PM, "staysafe23"
<staysafe23@gmail.com<mailto:staysafe23@gmail.com>> wrote:
Hi Petr,
Thank you again for your help. I am making a mistake since I have assigned an
entire vector oo1 to dev1. What I errantly thought I was doing was starting with
the value of 5 in ss, then picking the value of -0.50 in cc, then picking the
value of -10 in oo1, then picking the value of 0 in oo2, and running the code
that is within the inner most brackets and putting the output into an output
file.
Then I thought the loop would move on to the next case, 5 in ss, then picking
the value of -0.50 in cc, then picking the value of -10 in oo1, then picking the
value of 5 in oo2. So I thought I would end up with my code being run a number
of times that would equal the length(ss)*length(cc)*length(oo1)*length(oo2) .
I can't seem to get the code to run through each of these conditions. Do you
have any idea that may help me do so?
Thank you Petr,
Thomas
On Feb 6, 2013 2:25 AM, "PIKAL Petr"
<petr.pikal@precheza.cz<mailto:petr.pikal@precheza.cz>> wrote:
Hi
This is an error I get with your loop code due to this line
capture.output(print(lll), file = "C:/Chi_Square_fix/temp.txt", append
= TRUE)
Error in file(file, if (append) "a" else "w") :
cannot open the connection
In addition: Warning messages:
1: In chisq.test(lll[["mat4"]], correct = FALSE) :
Chi-squared approximation may be incorrect
2: In chisq.test(lll[["mat4"]], correct = TRUE) :
Chi-squared approximation may be incorrect
3: In file(file, if (append) "a" else "w") :
cannot open file 'C:/Chi_Square_fix/temp.txt': No such file or
directory>
Without this line I get no error and everything is probably printed. I do not
know function capture.output but I presume that you need initialise the file
temp.txt before you can output to it.
Anyway those cycles are rather weird. E.g. in each cycle you assign whole vector
oo1 to dev1.
Is it intended?
Regards
Petr
From: staysafe23
[mailto:staysafe23@gmail.com<mailto:staysafe23@gmail.com>]
Sent: Friday, February 01, 2013 10:12 PM
To: PIKAL Petr
Cc: r-help@r-project.org<mailto:r-help@r-project.org>
Subject: RE: [R] Nested loop and output help
Thank you very much Petr,
I believe I have fixed my inquiry to not use floating points in my cycle as you
pointed out and to use the list structure to keep my results. I am still at a
loss as to how to run the multiple loops. I have tried quite a few different
strategies but my failure seems to illustrate that my understanding of how the
loops will run is nonexistent.
I would like to simultaneously let the following 4 things vary:
z1 <- rnorm(ss,mean=400, sd=70) and z2 <- rnorm(ss,mean=450, sd=90) by ss
<- seq(5,9,by=1) which yields 5 6 7 8 9
r <- cc by cc <- seq(-0.5,0.5, by=0.25) which yields -0.50 -0.25 0.00 0.25
0.50
dev1 <- oo1 by oo1 <- seq(-10,10, by=5) which yields -10 -5 0 5 10
dev2 <- oo2 by oo2 <- seq(0,20, by=5) which yields 0 5 10 15 20
I tried to run the loops that would vary each of these above conditions with the
looped code attached below and failed very badly.
Thank you Petr and all,
Best,
Thomas
###################################SINGLE RUN
CODE####################################
lll <- vector(mode = "list", length = 10)
names(lll) <- c("mat1", "mat2", "mat3",
"mat4", "cut1", "cut2", "out3a",
"out3b", "out4a", "out4b")
z1 <- rnorm(20,mean=400, sd=70)
z2 <- rnorm(20,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-lll[["cut1"]]
Y2 <- Y-lll[["cut2"]]
c3 <- cor(X2,Y2)
lll[["mat2"]] <-cbind(X2,Y2)
a11 <- ifelse( X < lll[["cut1"]] & Y <
lll[["cut2"]], 1, 0)
a12 <- ifelse( X < lll[["cut1"]] & Y >=
lll[["cut2"]], 1, 0)
a21 <- ifelse( X >= lll[["cut1"]] & Y <
lll[["cut2"]], 1, 0)
a22 <- ifelse( X >= lll[["cut1"]] & Y >=
lll[["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(lll[["mat3"]],
correct=FALSE)
lll[["out3b"]] <- mcnemar.test(lll[["mat3"]],
correct=TRUE)
lll[["out4a"]] <- chisq.test(lll[["mat4"]], correct =
FALSE)
lll[["out4b"]] <- chisq.test(lll[["mat4"]], correct =
TRUE)
print(lll)
capture.output(print(lll), file = "C:/Chi_Square_fix/temp.txt", append
= TRUE)
######################################LOOPED
CODE#####################################
lll <- vector(mode = "list", length = 10)
names(lll) <- c("mat1", "mat2", "mat3",
"mat4", "cut1", "cut2", "out3a",
"out3b", "out4a", "out4b")
ss <- seq(5,9,by=1)
cc <- seq(-0.5,0.5, by=0.25)
oo1 <- seq(-10,10, by=5)
oo2 <- seq(0,20, by=5)
for(i in ss) {
for (j in cc) {
for (k in oo1) {
for (l in oo2) {
z1 <- rnorm(ss,mean=400, sd=70)
z2 <- rnorm(ss,mean=450, sd=90)
r <- cc
X <- z1
Y = r*z1+(1-r)*z2
lll[["mat1"]] <- cbind(X,Y)
dev1 <- oo1
lll[["cut1"]] <- mean(X) + dev1
dev2 <- oo2
lll[["cut2"]] <- mean(X) + dev1 + dev2
X2 <- X-lll[["cut1"]]
Y2 <- Y-lll[["cut2"]]
c3 <- cor(X2,Y2)
lll[["mat2"]] <-cbind(X2,Y2)
a11 <- ifelse( X < lll[["cut1"]] & Y <
lll[["cut2"]], 1, 0)
a12 <- ifelse( X < lll[["cut1"]] & Y >=
lll[["cut2"]], 1, 0)
a21 <- ifelse( X >= lll[["cut1"]] & Y <
lll[["cut2"]], 1, 0)
a22 <- ifelse( X >= lll[["cut1"]] & Y >=
lll[["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(lll[["mat3"]],
correct=FALSE)
lll[["out3b"]] <- mcnemar.test(lll[["mat3"]],
correct=TRUE)
lll[["out4a"]] <- chisq.test(lll[["mat4"]], correct =
FALSE)
lll[["out4b"]] <- chisq.test(lll[["mat4"]], correct =
TRUE)
print(lll)
capture.output(print(lll), file = "C:/Chi_Square_fix/temp.txt", append
= TRUE)
}
}
}
}
On Feb 1, 2013 2:01 AM, "PIKAL Petr"
<petr.pikal@precheza.cz<mailto:petr.pikal@precheza.cz>> wrote:
Hi
see inline
> -----Original Message-----
> From:
r-help-bounces@r-project.org<mailto:r-help-bounces@r-project.org>
[mailto:r-help-bounces@r-<mailto:r-help-bounces@r->
> project.org<http://project.org>] On Behalf Of staysafe23
> Sent: Friday, February 01, 2013 1:01 AM
> To: r-help@r-project.org<mailto:r-help@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@r-project.org<mailto:R-help@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.
[[alternative HTML version deleted]]