allomr {allomr} | R Documentation |
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>.
Usage
allomr(X, Y, X0, a, b)
Arguments
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. |
Details
Calculates X_{0}
as the mean of X
and the regression parameters a
and b
(if not specified) according to equation (A.5). Y^*
is calculated according to equation (13) and the particular shape factor exp(\varepsilon_{i})
according to equation (9) in Lleonart et al. (2000) <doi:10.1006/jtbi.2000.2043>.
Value
A list containing sample size for X
(n), the regression parameters a
(a) and b
(b), X_{0}
(X0), a vector containing the normalized values Y^*
(Yx) and a vector containing the values for the particular shape factor exp(\varepsilon_{i})
(exp_e).
Author(s)
Sämi Schär
References
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
## 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)
}
}