Dear List,

I have been trying to extract associations from a matrix whereby individual locations are within a certain distance threshold from one another.

I have been able to extract those individuals where there is 'no interaction' (i.e. where these individuals are not within a specified distance threshold from another individual) and give these individuals a unique Group ID containing that one individual.

i.e.

   ID Group

1 ID1     1

2 ID3     2

3 ID4     3

4 ID5     4

5 ID7     5

6 ID8     6

7 ID9     7


What I need assistance with is allocating associations with a unique group id.
i.e. If we have interactions between  "ID2_ID6", "ID6_ID2", "ID6_ID10", "ID10_ID6" as in the example code...


   ID Group

1 ID1     1

2 ID3     2

3 ID4     3

4 ID5     4

5 ID7     5

6 ID8     6

7 ID9     7

##
8 ID2     8
9 ID6     8
10 ID10     8

##
The code also needs to robust enough to recognize instances where we have an interaction in a separate group...
i.e. "ID11_ID12" should be in a separate group (Group 9) as they don't interact with IDs 2, 6, or 10 (not in below code!)
11 ID11     9
12 ID12     9


I've been trying to figure this out but have drawn a blank. My example code can be found below.

Very best wishes,

Ross

Dr Ross Dwyer
Postdoctoral Research Fellow
University of Queensland



> ###
> require(stats)
> x <- sample(1:20,10)
> y <- sample(1:20,10)
> IDs <- sapply(1:10,function(i) paste("ID",i,sep=""))
> (DFid <- data.frame(x,y))
    x  y
1   7 20
2   5  3
3  12  5
4   3 12
5  18 19
6   2  1
7  19 15
8  20 11
9  13 14
10  1  2
>
>
> (DMdist <- dist(DFid, method = "euclidean",
+                diag = FALSE, upper = TRUE))
           1         2         3         4         5         6         7         8         9        10
1            17.117243 15.811388  8.944272 11.045361 19.646883 13.000000 15.811388  8.485281 18.973666
2  17.117243            7.280110  9.219544 20.615528  3.605551 18.439089 17.000000 13.601471  4.123106
3  15.811388  7.280110           11.401754 15.231546 10.770330 12.206556 10.000000  9.055385 11.401754
4   8.944272  9.219544 11.401754           16.552945 11.045361 16.278821 17.029386 10.198039 10.198039
5  11.045361 20.615528 15.231546 16.552945           24.083189  4.123106  8.246211  7.071068 24.041631
6  19.646883  3.605551 10.770330 11.045361 24.083189           22.022716 20.591260 17.029386  1.414214
7  13.000000 18.439089 12.206556 16.278821  4.123106 22.022716            4.123106  6.082763 22.203603
8  15.811388 17.000000 10.000000 17.029386  8.246211 20.591260  4.123106            7.615773 21.023796
9   8.485281 13.601471  9.055385 10.198039  7.071068 17.029386  6.082763  7.615773           16.970563
10 18.973666  4.123106 11.401754 10.198039 24.041631  1.414214 22.203603 21.023796 16.970563
>
> #Generate True/False matrix on those individuals < 4 units apart
> DMTF <- apply(as.matrix(DMdist), c(1,2), function(x) ifelse(x<=4,T,F))
> diag(DMTF)<- NA #replace diagonal with NA
> dimnames(DMTF) <- list(IDs, IDs) #add individual's name to matrix
>
> DMTF
       ID1   ID2   ID3   ID4   ID5   ID6   ID7   ID8   ID9  ID10
ID1     NA FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
ID2  FALSE    NA FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
ID3  FALSE FALSE    NA FALSE FALSE FALSE FALSE FALSE FALSE FALSE
ID4  FALSE FALSE FALSE    NA FALSE FALSE FALSE FALSE FALSE FALSE
ID5  FALSE FALSE FALSE FALSE    NA FALSE FALSE FALSE FALSE FALSE
ID6  FALSE  TRUE FALSE FALSE FALSE    NA FALSE FALSE FALSE  TRUE
ID7  FALSE FALSE FALSE FALSE FALSE FALSE    NA FALSE FALSE FALSE
ID8  FALSE FALSE FALSE FALSE FALSE FALSE FALSE    NA FALSE FALSE
ID9  FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE    NA FALSE
ID10 FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE    NA
>
> irow <- as.character(gl(length(IDs),length(IDs),labels=IDs))
> icol <-rep(IDs, length(IDs))
>
> AssocMatrix <- matrix(data=paste(irow,"_",icol,"_",sep=""),
+                       nrow = length(IDs), ncol = length(IDs),
+                       dimnames= list(IDs, IDs))
>
> AssocMatrix

     ID1         ID2         ID3         ID4         ID5         ID6         ID7         ID8         ID9         ID10

ID1  "ID1_ID1_"  "ID2_ID1_"  "ID3_ID1_"  "ID4_ID1_"  "ID5_ID1_"  "ID6_ID1_"  "ID7_ID1_"  "ID8_ID1_"  "ID9_ID1_"  "ID10_ID1_"

ID2  "ID1_ID2_"  "ID2_ID2_"  "ID3_ID2_"  "ID4_ID2_"  "ID5_ID2_"  "ID6_ID2_"  "ID7_ID2_"  "ID8_ID2_"  "ID9_ID2_"  "ID10_ID2_"

ID3  "ID1_ID3_"  "ID2_ID3_"  "ID3_ID3_"  "ID4_ID3_"  "ID5_ID3_"  "ID6_ID3_"  "ID7_ID3_"  "ID8_ID3_"  "ID9_ID3_"  "ID10_ID3_"

ID4  "ID1_ID4_"  "ID2_ID4_"  "ID3_ID4_"  "ID4_ID4_"  "ID5_ID4_"  "ID6_ID4_"  "ID7_ID4_"  "ID8_ID4_"  "ID9_ID4_"  "ID10_ID4_"

ID5  "ID1_ID5_"  "ID2_ID5_"  "ID3_ID5_"  "ID4_ID5_"  "ID5_ID5_"  "ID6_ID5_"  "ID7_ID5_"  "ID8_ID5_"  "ID9_ID5_"  "ID10_ID5_"

ID6  "ID1_ID6_"  "ID2_ID6_"  "ID3_ID6_"  "ID4_ID6_"  "ID5_ID6_"  "ID6_ID6_"  "ID7_ID6_"  "ID8_ID6_"  "ID9_ID6_"  "ID10_ID6_"

ID7  "ID1_ID7_"  "ID2_ID7_"  "ID3_ID7_"  "ID4_ID7_"  "ID5_ID7_"  "ID6_ID7_"  "ID7_ID7_"  "ID8_ID7_"  "ID9_ID7_"  "ID10_ID7_"

ID8  "ID1_ID8_"  "ID2_ID8_"  "ID3_ID8_"  "ID4_ID8_"  "ID5_ID8_"  "ID6_ID8_"  "ID7_ID8_"  "ID8_ID8_"  "ID9_ID8_"  "ID10_ID8_"

ID9  "ID1_ID9_"  "ID2_ID9_"  "ID3_ID9_"  "ID4_ID9_"  "ID5_ID9_"  "ID6_ID9_"  "ID7_ID9_"  "ID8_ID9_"  "ID9_ID9_"  "ID10_ID9_"

ID10 "ID1_ID10_" "ID2_ID10_" "ID3_ID10_" "ID4_ID10_" "ID5_ID10_" "ID6_ID10_" "ID7_ID10_" "ID8_ID10_" "ID9_ID10_" "ID10_ID10_"
>
> (AMatrix <- as.character(unique(AssocMatrix[which(DMTF==TRUE)])))
[1] "ID2_ID6"  "ID6_ID2"  "ID6_ID10" "ID10_ID6"
>

> ##Extract those individuals not in any interactions

> nonassoc <- IDs[is.na(charmatch(inassoc,AMatrix))]

>

> (NGroups <- data.frame(ID=nonassoc,Group=1:length(nonassoc)))

   ID Group

1 ID1     1

2 ID3     2

3 ID4     3

4 ID5     4

5 ID7     5

6 ID8     6

7 ID9     7



>





	[[alternative HTML version deleted]]

