list contingency tables

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

list contingency tables

li li-13
Hi all,
  I am trying to list all the 4 by 2 tables with some fixed margins.
  For example, consider 4 by 2 tables with row margins 1,2,2,1 and
column margins 3,3. I was able to do it using the code below. However,
as seen below, I had to first count the total number of tables with
the specific row margins and column margins in order to create space
to store the tables.
Is there a way to skip the step of counting the number of tables?
  Also, wanted to avoid for loops as much as possible since it can be
extremely slow and inefficient.
   Thanks so much in advance for you insight and help.
       Hanna



> library(gtools)
> A <- permutations(n=4,r=2,v=0:3, repeats.allowed=TRUE)
> B <- apply(A, 1, sum)
> rmg <- c(1,2,2,1)
> cmg <- c(3,3)
> m1 <- t(A[which(B==1),])
> m2 <- t(A[which(B==2),])
> m3 <- t(A[which(B==2),])
>
> ##count number of tables with row margins 1,2,2,1 and column margins 3,3.
> num <- 0
> for (i in 1:ncol(m1)){
+     for (j in 1:ncol(m2)){
+         for (k in 1:ncol(m3)){
+             M <- t(cbind(m1[,i], m2[,j], m3[,k]))
+             M1 <- rbind(M, cmg-apply(M,2,sum))
+             num <- num+(sum(M1[4,] < 0) == 0)
+         }}}
>
>
> #create space to store the tables
> C <- array(NA, dim=c(4,2,num))
>
> # list all the tables with fixed margins
> num <- 0
> for (i in 1:ncol(m1)){
+     for (j in 1:ncol(m2)){
+         for (k in 1:ncol(m3)){
+             M <- t(cbind(m1[,i], m2[,j], m3[,k]))
+             M1 <- rbind(M,cmg-apply(M,2,sum))
+             if (sum(M1[4,] < 0) == 0) {
+                 num <- num+1
+                C[,,num] <- M1
+             }
+         }}}
>
> C
, , 1

     [,1] [,2]
[1,]    0    1
[2,]    0    2
[3,]    2    0
[4,]    1    0

, , 2

     [,1] [,2]
[1,]    0    1
[2,]    1    1
[3,]    1    1
[4,]    1    0

, , 3

     [,1] [,2]
[1,]    0    1
[2,]    1    1
[3,]    2    0
[4,]    0    1

, , 4

     [,1] [,2]
[1,]    0    1
[2,]    2    0
[3,]    0    2
[4,]    1    0

, , 5

     [,1] [,2]
[1,]    0    1
[2,]    2    0
[3,]    1    1
[4,]    0    1

, , 6

     [,1] [,2]
[1,]    1    0
[2,]    0    2
[3,]    1    1
[4,]    1    0

, , 7

     [,1] [,2]
[1,]    1    0
[2,]    0    2
[3,]    2    0
[4,]    0    1

, , 8

     [,1] [,2]
[1,]    1    0
[2,]    1    1
[3,]    0    2
[4,]    1    0

, , 9

     [,1] [,2]
[1,]    1    0
[2,]    1    1
[3,]    1    1
[4,]    0    1

, , 10

     [,1] [,2]
[1,]    1    0
[2,]    2    0
[3,]    0    2
[4,]    0    1

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
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.
Reply | Threaded
Open this post in threaded view
|

Re: list contingency tables

Jeff Newmiller
Don't give up on for loops entirely... some of the largest time savings in optimizing loops are achieved by managing memory effectively. [1]

[1] https://www.r-bloggers.com/r-tip-use-vectormode-list-to-pre-allocate-lists


On November 8, 2018 8:05:39 PM PST, li li <[hidden email]> wrote:

>Hi all,
>  I am trying to list all the 4 by 2 tables with some fixed margins.
>  For example, consider 4 by 2 tables with row margins 1,2,2,1 and
>column margins 3,3. I was able to do it using the code below. However,
>as seen below, I had to first count the total number of tables with
>the specific row margins and column margins in order to create space
>to store the tables.
>Is there a way to skip the step of counting the number of tables?
>  Also, wanted to avoid for loops as much as possible since it can be
>extremely slow and inefficient.
>   Thanks so much in advance for you insight and help.
>       Hanna
>
>
>
>> library(gtools)
>> A <- permutations(n=4,r=2,v=0:3, repeats.allowed=TRUE)
>> B <- apply(A, 1, sum)
>> rmg <- c(1,2,2,1)
>> cmg <- c(3,3)
>> m1 <- t(A[which(B==1),])
>> m2 <- t(A[which(B==2),])
>> m3 <- t(A[which(B==2),])
>>
>> ##count number of tables with row margins 1,2,2,1 and column margins
>3,3.
>> num <- 0
>> for (i in 1:ncol(m1)){
>+     for (j in 1:ncol(m2)){
>+         for (k in 1:ncol(m3)){
>+             M <- t(cbind(m1[,i], m2[,j], m3[,k]))
>+             M1 <- rbind(M, cmg-apply(M,2,sum))
>+             num <- num+(sum(M1[4,] < 0) == 0)
>+         }}}
>>
>>
>> #create space to store the tables
>> C <- array(NA, dim=c(4,2,num))
>>
>> # list all the tables with fixed margins
>> num <- 0
>> for (i in 1:ncol(m1)){
>+     for (j in 1:ncol(m2)){
>+         for (k in 1:ncol(m3)){
>+             M <- t(cbind(m1[,i], m2[,j], m3[,k]))
>+             M1 <- rbind(M,cmg-apply(M,2,sum))
>+             if (sum(M1[4,] < 0) == 0) {
>+                 num <- num+1
>+                C[,,num] <- M1
>+             }
>+         }}}
>>
>> C
>, , 1
>
>     [,1] [,2]
>[1,]    0    1
>[2,]    0    2
>[3,]    2    0
>[4,]    1    0
>
>, , 2
>
>     [,1] [,2]
>[1,]    0    1
>[2,]    1    1
>[3,]    1    1
>[4,]    1    0
>
>, , 3
>
>     [,1] [,2]
>[1,]    0    1
>[2,]    1    1
>[3,]    2    0
>[4,]    0    1
>
>, , 4
>
>     [,1] [,2]
>[1,]    0    1
>[2,]    2    0
>[3,]    0    2
>[4,]    1    0
>
>, , 5
>
>     [,1] [,2]
>[1,]    0    1
>[2,]    2    0
>[3,]    1    1
>[4,]    0    1
>
>, , 6
>
>     [,1] [,2]
>[1,]    1    0
>[2,]    0    2
>[3,]    1    1
>[4,]    1    0
>
>, , 7
>
>     [,1] [,2]
>[1,]    1    0
>[2,]    0    2
>[3,]    2    0
>[4,]    0    1
>
>, , 8
>
>     [,1] [,2]
>[1,]    1    0
>[2,]    1    1
>[3,]    0    2
>[4,]    1    0
>
>, , 9
>
>     [,1] [,2]
>[1,]    1    0
>[2,]    1    1
>[3,]    1    1
>[4,]    0    1
>
>, , 10
>
>     [,1] [,2]
>[1,]    1    0
>[2,]    2    0
>[3,]    0    2
>[4,]    0    1
>
>______________________________________________
>[hidden email] mailing list -- To UNSUBSCRIBE and more, see
>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.

--
Sent from my phone. Please excuse my brevity.

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
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.
Reply | Threaded
Open this post in threaded view
|

Re: list contingency tables

David Winsemius
In reply to this post by li li-13
Seems like you are trying to recreate the calculations needed to perform
an exact test. Why not look at the code for that or even easier, just
use the function.

--

David.

On 11/8/18 8:05 PM, li li wrote:

> Hi all,
>    I am trying to list all the 4 by 2 tables with some fixed margins.
>    For example, consider 4 by 2 tables with row margins 1,2,2,1 and
> column margins 3,3. I was able to do it using the code below. However,
> as seen below, I had to first count the total number of tables with
> the specific row margins and column margins in order to create space
> to store the tables.
> Is there a way to skip the step of counting the number of tables?
>    Also, wanted to avoid for loops as much as possible since it can be
> extremely slow and inefficient.
>     Thanks so much in advance for you insight and help.
>         Hanna
>
>
>
>> library(gtools)
>> A <- permutations(n=4,r=2,v=0:3, repeats.allowed=TRUE)
>> B <- apply(A, 1, sum)
>> rmg <- c(1,2,2,1)
>> cmg <- c(3,3)
>> m1 <- t(A[which(B==1),])
>> m2 <- t(A[which(B==2),])
>> m3 <- t(A[which(B==2),])
>>
>> ##count number of tables with row margins 1,2,2,1 and column margins 3,3.
>> num <- 0
>> for (i in 1:ncol(m1)){
> +     for (j in 1:ncol(m2)){
> +         for (k in 1:ncol(m3)){
> +             M <- t(cbind(m1[,i], m2[,j], m3[,k]))
> +             M1 <- rbind(M, cmg-apply(M,2,sum))
> +             num <- num+(sum(M1[4,] < 0) == 0)
> +         }}}
>>
>> #create space to store the tables
>> C <- array(NA, dim=c(4,2,num))
>>
>> # list all the tables with fixed margins
>> num <- 0
>> for (i in 1:ncol(m1)){
> +     for (j in 1:ncol(m2)){
> +         for (k in 1:ncol(m3)){
> +             M <- t(cbind(m1[,i], m2[,j], m3[,k]))
> +             M1 <- rbind(M,cmg-apply(M,2,sum))
> +             if (sum(M1[4,] < 0) == 0) {
> +                 num <- num+1
> +                C[,,num] <- M1
> +             }
> +         }}}
>> C
> , , 1
>
>       [,1] [,2]
> [1,]    0    1
> [2,]    0    2
> [3,]    2    0
> [4,]    1    0
>
> , , 2
>
>       [,1] [,2]
> [1,]    0    1
> [2,]    1    1
> [3,]    1    1
> [4,]    1    0
>
> , , 3
>
>       [,1] [,2]
> [1,]    0    1
> [2,]    1    1
> [3,]    2    0
> [4,]    0    1
>
> , , 4
>
>       [,1] [,2]
> [1,]    0    1
> [2,]    2    0
> [3,]    0    2
> [4,]    1    0
>
> , , 5
>
>       [,1] [,2]
> [1,]    0    1
> [2,]    2    0
> [3,]    1    1
> [4,]    0    1
>
> , , 6
>
>       [,1] [,2]
> [1,]    1    0
> [2,]    0    2
> [3,]    1    1
> [4,]    1    0
>
> , , 7
>
>       [,1] [,2]
> [1,]    1    0
> [2,]    0    2
> [3,]    2    0
> [4,]    0    1
>
> , , 8
>
>       [,1] [,2]
> [1,]    1    0
> [2,]    1    1
> [3,]    0    2
> [4,]    1    0
>
> , , 9
>
>       [,1] [,2]
> [1,]    1    0
> [2,]    1    1
> [3,]    1    1
> [4,]    0    1
>
> , , 10
>
>       [,1] [,2]
> [1,]    1    0
> [2,]    2    0
> [3,]    0    2
> [4,]    0    1
>
> ______________________________________________
> [hidden email] mailing list -- To UNSUBSCRIBE and more, see
> 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.

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
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.
Reply | Threaded
Open this post in threaded view
|

Re: list contingency tables

Bert Gunter-2
Yes, exactly (heh, heh).

?fisher.test

is probably what is wanted.

For arbitrary rxc tables with fixed marginals, this is a difficult problem.
Mehta's efficient network algorithm to solve it can be found by a web
search on "algorithm for Fisher exact test."

-- Bert



On Fri, Nov 9, 2018 at 12:36 PM David Winsemius <[hidden email]>
wrote:

> Seems like you are trying to recreate the calculations needed to perform
> an exact test. Why not look at the code for that or even easier, just
> use the function.
>
> --
>
> David.
>
> On 11/8/18 8:05 PM, li li wrote:
> > Hi all,
> >    I am trying to list all the 4 by 2 tables with some fixed margins.
> >    For example, consider 4 by 2 tables with row margins 1,2,2,1 and
> > column margins 3,3. I was able to do it using the code below. However,
> > as seen below, I had to first count the total number of tables with
> > the specific row margins and column margins in order to create space
> > to store the tables.
> > Is there a way to skip the step of counting the number of tables?
> >    Also, wanted to avoid for loops as much as possible since it can be
> > extremely slow and inefficient.
> >     Thanks so much in advance for you insight and help.
> >         Hanna
> >
> >
> >
> >> library(gtools)
> >> A <- permutations(n=4,r=2,v=0:3, repeats.allowed=TRUE)
> >> B <- apply(A, 1, sum)
> >> rmg <- c(1,2,2,1)
> >> cmg <- c(3,3)
> >> m1 <- t(A[which(B==1),])
> >> m2 <- t(A[which(B==2),])
> >> m3 <- t(A[which(B==2),])
> >>
> >> ##count number of tables with row margins 1,2,2,1 and column margins
> 3,3.
> >> num <- 0
> >> for (i in 1:ncol(m1)){
> > +     for (j in 1:ncol(m2)){
> > +         for (k in 1:ncol(m3)){
> > +             M <- t(cbind(m1[,i], m2[,j], m3[,k]))
> > +             M1 <- rbind(M, cmg-apply(M,2,sum))
> > +             num <- num+(sum(M1[4,] < 0) == 0)
> > +         }}}
> >>
> >> #create space to store the tables
> >> C <- array(NA, dim=c(4,2,num))
> >>
> >> # list all the tables with fixed margins
> >> num <- 0
> >> for (i in 1:ncol(m1)){
> > +     for (j in 1:ncol(m2)){
> > +         for (k in 1:ncol(m3)){
> > +             M <- t(cbind(m1[,i], m2[,j], m3[,k]))
> > +             M1 <- rbind(M,cmg-apply(M,2,sum))
> > +             if (sum(M1[4,] < 0) == 0) {
> > +                 num <- num+1
> > +                C[,,num] <- M1
> > +             }
> > +         }}}
> >> C
> > , , 1
> >
> >       [,1] [,2]
> > [1,]    0    1
> > [2,]    0    2
> > [3,]    2    0
> > [4,]    1    0
> >
> > , , 2
> >
> >       [,1] [,2]
> > [1,]    0    1
> > [2,]    1    1
> > [3,]    1    1
> > [4,]    1    0
> >
> > , , 3
> >
> >       [,1] [,2]
> > [1,]    0    1
> > [2,]    1    1
> > [3,]    2    0
> > [4,]    0    1
> >
> > , , 4
> >
> >       [,1] [,2]
> > [1,]    0    1
> > [2,]    2    0
> > [3,]    0    2
> > [4,]    1    0
> >
> > , , 5
> >
> >       [,1] [,2]
> > [1,]    0    1
> > [2,]    2    0
> > [3,]    1    1
> > [4,]    0    1
> >
> > , , 6
> >
> >       [,1] [,2]
> > [1,]    1    0
> > [2,]    0    2
> > [3,]    1    1
> > [4,]    1    0
> >
> > , , 7
> >
> >       [,1] [,2]
> > [1,]    1    0
> > [2,]    0    2
> > [3,]    2    0
> > [4,]    0    1
> >
> > , , 8
> >
> >       [,1] [,2]
> > [1,]    1    0
> > [2,]    1    1
> > [3,]    0    2
> > [4,]    1    0
> >
> > , , 9
> >
> >       [,1] [,2]
> > [1,]    1    0
> > [2,]    1    1
> > [3,]    1    1
> > [4,]    0    1
> >
> > , , 10
> >
> >       [,1] [,2]
> > [1,]    1    0
> > [2,]    2    0
> > [3,]    0    2
> > [4,]    0    1
> >
> > ______________________________________________
> > [hidden email] mailing list -- To UNSUBSCRIBE and more, see
> > 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.
>
> ______________________________________________
> [hidden email] mailing list -- To UNSUBSCRIBE and more, see
> 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]]

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
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.