Colin Garroway
2009-Mar-27 17:33 UTC
[R] General help for a function I'm attempting to write
Hello, I have written a small function ('JostD' based upon a recent molecular ecology paper) to calculate genetic distance between populations (columns in my data set). As I have it now I have to tell it which 2 columns to use (X, Y). I would like it to automatically calculate 'JostD' for all combinations of columns, perhaps returning a matrix of distances. Thanks for any help or suggestions. Cheers Colin Function: JostD <- function(DF, X, Y) { Ni1 <- DF[,X] Ni2 <- DF[,Y] N1 <- sum(Ni1) N2 <- sum(Ni2) pi1 <-Ni1/N1 pi2 <-Ni2/N2 pisqr <- ((pi1+pi2)/2)^2 H1 <- 1 - sum(pi1^2) H2 <- 1 - sum(pi2^2) Ha <- 0.5*(H1+H2) Da <- 1/(1-Ha) Dg <- 1/sum(pisqr) Db <- Dg/Da D <- -2*((1/Db) - 1) D } Sample data: e<-c(0,0,0,4,27) r<-c(0,1,0,7,16) t<-c(1,0,0,16,44) y<-c(0,0,0,2,39) df<-cbind(e,r,t,y) rownames(df)<-q colnames(df)<-w> dfP01 P02 P03 P04 L01.1 0 0 1 0 L01.2 0 1 0 0 L01.3 0 0 0 0 L01.4 4 7 16 2 L01.5 27 16 44 39> JostD(df, 1, 2)[1] 0.0535215> JostD(df, 1, 3)[1] 0.02962404>-- Colin Garroway (PhD candidate) Wildlife Research and Development Section Ontario Ministry of Natural Resources Trent University, DNA Building 2140 East Bank Drive Peterborough, ON, K9J 7B8 Canada [[alternative HTML version deleted]]
Jorge Ivan Velez
2009-Mar-28 02:27 UTC
[R] General help for a function I'm attempting to write
Dear Colin, Try this: # Data DF <- structure(c(0, 0, 0, 4, 27, 0, 1, 0, 7, 16, 1, 0, 0, 16, 44, 0, 0, 0, 2, 39), .Dim = c(5L, 4L), .Dimnames = list(c("L01.1", "L01.2", "L01.3", "L01.4", "L01.5"), c("P01", "P02", "P03", "P04" ))) # Distances Names<-t(combn(colnames(DF),2)) apply(Names,1,function(x) JostD(x[1],x[2], DF)) HTH, Jorge On Fri, Mar 27, 2009 at 1:33 PM, Colin Garroway <colin.garroway@gmail.com>wrote:> Hello, > > I have written a small function ('JostD' based upon a recent molecular > ecology paper) to calculate genetic distance between populations (columns > in > my data set). As I have it now I have to tell it which 2 columns to use > (X, > Y). I would like it to automatically calculate 'JostD' for all > combinations > of columns, perhaps returning a matrix of distances. Thanks for any help > or > suggestions. > Cheers > Colin > > > > Function: > > JostD <- function(DF, X, Y) { > > Ni1 <- DF[,X] > Ni2 <- DF[,Y] > > N1 <- sum(Ni1) > N2 <- sum(Ni2) > > pi1 <-Ni1/N1 > pi2 <-Ni2/N2 > pisqr <- ((pi1+pi2)/2)^2 > > H1 <- 1 - sum(pi1^2) > H2 <- 1 - sum(pi2^2) > Ha <- 0.5*(H1+H2) > > Da <- 1/(1-Ha) > Dg <- 1/sum(pisqr) > Db <- Dg/Da > D <- -2*((1/Db) - 1) > D > } > > Sample data: > > e<-c(0,0,0,4,27) > r<-c(0,1,0,7,16) > t<-c(1,0,0,16,44) > y<-c(0,0,0,2,39) > df<-cbind(e,r,t,y) > rownames(df)<-q > colnames(df)<-w > > > df > P01 P02 P03 P04 > L01.1 0 0 1 0 > L01.2 0 1 0 0 > L01.3 0 0 0 0 > L01.4 4 7 16 2 > L01.5 27 16 44 39 > > > JostD(df, 1, 2) > [1] 0.0535215 > > > JostD(df, 1, 3) > [1] 0.02962404 > > > > > > > > -- > Colin Garroway (PhD candidate) > Wildlife Research and Development Section > Ontario Ministry of Natural Resources > Trent University, DNA Building > 2140 East Bank Drive > Peterborough, ON, K9J 7B8 > Canada > > [[alternative HTML version deleted]] > > ______________________________________________ > 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]]