Title: | Removing Allometric Effects of Body Size in Morphological Analysis |
---|---|
Description: | Implementation of the technique of Lleonart et al. (2000) <doi:10.1006/jtbi.2000.2043> to scale body measurements that exhibit an allometric growth. This procedure is a theoretical generalization of the technique used by Thorpe (1975) <doi:10.1111/j.1095-8312.1975.tb00732.x> and Thorpe (1976) <doi:10.1111/j.1469-185X.1976.tb01063.x>. |
Authors: | Sämi Schär [aut, cre, cph]
|
Maintainer: | Sämi Schär <[email protected]> |
License: | GPL (>= 3) |
Version: | 0.3.0 |
Built: | 2025-02-25 03:44:34 UTC |
Source: | https://github.com/cran/allomr |
Implementation of the technique of Lleonart et al. (2000) <doi:10.1006/jtbi.2000.2043> to scale body measurements that exhibit an allometric growth. This procedure is a theoretical generalization of the technique used by Thorpe (1975) <doi:10.1111/j.1095-8312.1975.tb00732.x> and Thorpe (1976) <doi:10.1111/j.1469-185X.1976.tb01063.x>.
allomr(X, Y, X0, a, b)
allomr(X, Y, X0, a, b)
X |
Required. A numerical vector, containing the first set of body measurements. |
Y |
Required. Either a numerical vector or an entire data set, containing the second set of body measurements. These are the measurements from which allometric effects will be removed. This is achieved by calculating Y*, the normalized value of Y this subject would reach when X=X0. |
X0 |
Optional. The value of X for which Y should be normalized. Default is the mean of X. |
a |
Optional. The regression parameter a. Derived from data if not specified or if Y is a data set. |
b |
Optional. The regression parameter b. Derived from data if not specified or if Y is a data set. |
Calculates as the mean of
and the regression parameters
and
(if not specified) according to equation (A.5).
is calculated according to equation (13) and the particular shape factor
according to equation (9) in Lleonart et al. (2000) <doi:10.1006/jtbi.2000.2043>.
A list containing sample size for (n), the regression parameters
(a) and
(b),
(X0), a vector containing the normalized values
(Yx) and a vector containing the values for the particular shape factor
(exp_e).
Sämi Schär
Lleonart et al. (2000). J. theor. Biol. 205, 85-93. <doi:10.1006/jtbi.2000.2043>
Thorpe (1975). Biol. J. Linn. Soc. 7, 27-43. <doi:10.1111/j.1095-8312.1975.tb00732.x>
Thorpe (1976), Biol. Rev. 51, 407-452. <doi:10.1111/j.1469-185X.1976.tb01063.x>
## examples from Lleonart et al. (2000), Appendix B ## note: small differences due to rounding in paper ## Table B1 gr1<-NULL gr1$X<- c(10.223, 11.184,12.251,11.922,11.485,11.625,11.303,11.662) gr1$Y<- c(1.184,1.371,1.676,1.662,1.509,1.539,1.481,1.417) gr1$Group<-c(rep(1, 8)) gr1d <- as.data.frame(gr1) gr2<-NULL gr2$X<- c(11.415,11.684,11.668, 11.322,12.553,12.213, 10.814, 10.493) gr2$Y<-c(1.364,1.508,1.535,1.387,1.522,1.502,1.256,1.230) gr2$Group<-c(rep(2, 8)) gr2d <- as.data.frame(gr2) B1 <- as.data.frame(rbind(gr1d, gr2d)) allomr(B1$X, B1$Y) ## Table B2 gr1<-NULL gr1$X<- c(3.050,2.783,2.492,3.543,2.495) gr1$Y<- c(2.349,2.129,1.936,2.813,1.908) gr1$Group<-c(rep(1, 5)) gr1d <- as.data.frame(gr1) gr2<-NULL gr2$X<- c(4.088,4.264,3.200,4.038,3.855) gr2$Y<- c(3.307,3.405,2.528,3.217,3.102) gr2$Group<-c(rep(2, 5)) gr2d <- as.data.frame(gr2) B2 <- as.data.frame(rbind(gr1d, gr2d)) allomr(X=B2$X, Y=B2$Y, X0=3.4, a=0.705, b=1.092) ## The function is currently defined as allomr <- function(X, Y, X0, a, b){ if (is.vector(Y)==TRUE){ m1 <- lm(log(Y)~log(X)) n <- length(X[!is.na(X)]) if (missing(a)){ a <- exp(m1$coefficients[1]) } if (missing(b)){ b <- m1$coefficients[2] } if (missing(X0)){ X0 <- mean(X, na.rm=TRUE) } Yx <- Y*(X0/X)^b exp_e <- Y/(a*X^b) obj <-list(n, a, b, X0, Yx, exp_e) names(obj) <-c("n","a","b","X0","Yx","exp_e") class(obj) <- "allomr" return(obj) } else { if (!missing(a) | !missing(b)){ message("NOTE: Y is a data set. Regression parameters will be derived from data.") } a<-NULL b<-NULL Yx<-NULL exp_e<-NULL for (i in 1:ncol(Y)){ m1<- lm(log(Y[[i]])~log(X)) n<-length(X[!is.na(X)]) a<- cbind(a, exp(m1$coefficients[1])) b<- cbind(b, m1$coefficients[2]) if (missing(X0)){ X0<-mean(X, na.rm=TRUE) } Yx<- cbind(Yx, Y[[i]]*(X0/X)^m1$coefficients[2]) exp_e<- cbind(exp_e, Y[[i]]/(exp(m1$coefficients[1])*X^m1$coefficients[2])) } obj <-list(n, a, b, X0, Yx, exp_e) names(obj) <-c("n","a","b","X0","Yx","exp_e") class(obj) <- "allomr" return(obj) } }
## examples from Lleonart et al. (2000), Appendix B ## note: small differences due to rounding in paper ## Table B1 gr1<-NULL gr1$X<- c(10.223, 11.184,12.251,11.922,11.485,11.625,11.303,11.662) gr1$Y<- c(1.184,1.371,1.676,1.662,1.509,1.539,1.481,1.417) gr1$Group<-c(rep(1, 8)) gr1d <- as.data.frame(gr1) gr2<-NULL gr2$X<- c(11.415,11.684,11.668, 11.322,12.553,12.213, 10.814, 10.493) gr2$Y<-c(1.364,1.508,1.535,1.387,1.522,1.502,1.256,1.230) gr2$Group<-c(rep(2, 8)) gr2d <- as.data.frame(gr2) B1 <- as.data.frame(rbind(gr1d, gr2d)) allomr(B1$X, B1$Y) ## Table B2 gr1<-NULL gr1$X<- c(3.050,2.783,2.492,3.543,2.495) gr1$Y<- c(2.349,2.129,1.936,2.813,1.908) gr1$Group<-c(rep(1, 5)) gr1d <- as.data.frame(gr1) gr2<-NULL gr2$X<- c(4.088,4.264,3.200,4.038,3.855) gr2$Y<- c(3.307,3.405,2.528,3.217,3.102) gr2$Group<-c(rep(2, 5)) gr2d <- as.data.frame(gr2) B2 <- as.data.frame(rbind(gr1d, gr2d)) allomr(X=B2$X, Y=B2$Y, X0=3.4, a=0.705, b=1.092) ## The function is currently defined as allomr <- function(X, Y, X0, a, b){ if (is.vector(Y)==TRUE){ m1 <- lm(log(Y)~log(X)) n <- length(X[!is.na(X)]) if (missing(a)){ a <- exp(m1$coefficients[1]) } if (missing(b)){ b <- m1$coefficients[2] } if (missing(X0)){ X0 <- mean(X, na.rm=TRUE) } Yx <- Y*(X0/X)^b exp_e <- Y/(a*X^b) obj <-list(n, a, b, X0, Yx, exp_e) names(obj) <-c("n","a","b","X0","Yx","exp_e") class(obj) <- "allomr" return(obj) } else { if (!missing(a) | !missing(b)){ message("NOTE: Y is a data set. Regression parameters will be derived from data.") } a<-NULL b<-NULL Yx<-NULL exp_e<-NULL for (i in 1:ncol(Y)){ m1<- lm(log(Y[[i]])~log(X)) n<-length(X[!is.na(X)]) a<- cbind(a, exp(m1$coefficients[1])) b<- cbind(b, m1$coefficients[2]) if (missing(X0)){ X0<-mean(X, na.rm=TRUE) } Yx<- cbind(Yx, Y[[i]]*(X0/X)^m1$coefficients[2]) exp_e<- cbind(exp_e, Y[[i]]/(exp(m1$coefficients[1])*X^m1$coefficients[2])) } obj <-list(n, a, b, X0, Yx, exp_e) names(obj) <-c("n","a","b","X0","Yx","exp_e") class(obj) <- "allomr" return(obj) } }