[R] Compositional Data Analysis
Tim Locke
t|m@|ocke123 @end|ng |rom hotm@||@com
Wed Jul 22 13:30:45 CEST 2020
Hi All,
I am currently working on a project examining the health effects of physical
activity using a compositional data (CoDa) approach. I am using a
linear regression to measure the effect of physical activity. What I want to
do is predict an outcome, e.g. body mass index, based on the mean physical
activity composition. I then want to alter this composition by reallocating
time from one behavior (such as sedentary) to light intensity physical
activity, and see what effect this has on BMI. I have included the code
below. My problem is that I cannot seem to generate this new composition
correctly.
library(compositions)
attach(Data_Analysis)
#Replace zeros in raw data with 0.00001
bedtimemins[bedtimemins==0] <- 0.00001
sedwakingmins[sedwakingmins==0] <- 0.00001
standingtimemins[standingtimemins==0] <- 0.00001
LIPAmins[LIPAmins==0] <- 0.00001
MVPAmins[MVPAmins==0] <- 0.00001
# make the composition by binding the components together
comp <- cbind(bedtimemins, sedwakingmins, standingtimemins, LIPAmins,
MVPAmins)
# tell R that comp is a compositional variable
comp <- acomp(comp)
#Generate variation matrix
PAvar_matrix <- var.acomp(comp)
# make the ilr multiple linear regression model. BMI = body mass index. .
lm <- lm(bmi ~ ilr(comp) + age)
#determine the mean composition, geometric mean of behaviors which sum to 1
comp.mean <- mean(comp)
# predict BMI for the mean composition from above, keeping age constant at
its mean.
mean.pred <- predict(lm, newdata=list(comp=comp.mean, age = mean(age)))
#generate new compostion of PA with 30 minutes of sleep reallocated to 30
mins of LIPA
new.comp <- acomp(comp.mean +c(-30/1440, 0/1440, 0/1440, 30/1440, 0/1440))
#predict BMI based on new composition
pred <- predict(lm, newdata=list(comp=new.comp, age=mean(age)))
#Estimated difference in BMI for the above reallocation
pred - mean.pred
When I run the command to generate the new composition, I receive the
message below
new.comp <- acomp(comp.mean +c(-30/1440, 0/1440, 0/1440, 30/1440, 0/1440))
Warning messages:
1: In acomp(gsi.mul(x, y)) :
Negative values in composition are used as detection limits
2: In acomp(comp.mean + c(-30/1440, 0/1440, 0/1440, 30/1440, 0/1440)) :
Negative values in composition are used as detection limits
When I print comp.mean I get a result that seems to make sense:
comp.mean
bedtimemins sedwakingmins standingtimemins LIPAmins MVPAmins
0.36410089 0.32460230 0.22278324 0.06948202 0.01903155
I can't say the same for the new composition:
new.comp
bedtimemins sedwakingmins standingtimemins LIPAmins MVPAmins
<5.240217 BDL BDL 1.000000 BDL
Any help or advice would be greatly appreciated!
[[alternative HTML version deleted]]
More information about the R-help
mailing list