Ihaveadatasetwiththefollowingvariablesforthetreatment(nutrition,fertilizer),thatrecord
I have a dataset with the following variables for the treatment (nutrition, fertilizer), that records algal growth in water across time (t0, t1...t10). In series with fertilizer marked as "nitrogen" , nitrogen was added after day t5. In series marked as "none", no nitrogen was added.
我有一个数据集,关于处理(营养,肥料),它记录了水随时间的海藻生长(t0, t1…t10)。在第5天之后,用标有“氮”的肥料,依次添加氮肥。在标记为“无”的系列中,不添加氮。
nutrition <- c("good","good","bad","bad","good","good","bad","bad","good","good","bad","bad","good","good","bad","bad")
fertlizer <- c("none", "nitrogen","none","nitrogen","none", "nitrogen","none","nitrogen","none", "nitrogen","none","nitrogen","none", "nitrogen","none","nitrogen")
t0 <- c(7, 6, 3, 20, 13, 4, 14, 9, 15, 5, 18, 19, 8, 1, 10, 16)
t1 <- c(12, 9, 3, 20, 4, 7, 6, 17, 19, 5, 18, 8, 15, 16, 10, 2)
t2 <- c(12, 9, 3, 20, 4, 7, 6, 17,7, 6, 3, 20, 13, 4, 14, 9)
t3 <- c(15, 5, 18, 19, 8, 1, 10, 16,4, 7, 6, 17,7, 6, 3, 20)
t4 <- c(6,7,12,4,7,18,9,10,2,10,11,14,15,1,14,16)
t5 <- c(4, 7, 6, 17,7, 6, 3, 20,15, 5, 18, 19, 8, 1, 10, 16)
t6 <- c(70,5,16,31,61,14,22,23,80,13,24,32,90,16,28,29)
t7 <- c(56,16,7,8,78,26,28,30,91,5,8,19,67,16,18,19)
t8 <- c(88,21,20,19,90,16,18,19,57,3, 20, 4, 7,67,13,12)
t9 <- c(62,12,15,27,71,20, 4, 7,72,6, 3, 20,73,14, 9, 15)
t10 <- c(40,13,7,19,50,3, 20, 7,66,14, 9, 15,80,16,18,19)
replicates <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)
data <- data.frame(nutrition, fertlizer,replicates, t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
data$nutrition <- as.factor(data$nutrition)
data$fertlizer <- as.factor(data$fertlizer)
I want to compare the slopes between groups and see if the slopes change after the fertilizer intervention. I want to use no fertilizer as control (i.e. (good, none) or (bad, none) as controls)
我想比较各组之间的坡度,看看肥料干预后坡度是否会变化。我希望不使用肥料作为控制(即(好的,没有)或(坏的,没有)作为控制)
I transform this data into long format with column headers as "nutrition", "fertilizer", "time", "replicates", and "growth" I create a new column called addition to distinguish between time periods before t5 and after t5. Time before t5 -> 0, after t5 ->1
我将这些数据转换为长格式,列标题为“营养”、“肥料”、“时间”、“复制”和“增长”,我创建了一个名为add的新列,用于区分t5之前和t5之后的时间段。t5 ->之前的时间,t5 ->1之后的时间
nutrition fertilizer time replicate growth addition
good none t0 1 6 0
good none t1 1 7 0
..
..
good none t5 1 3 1
I run the following longitudinal analysis, with each column having the following structure:
我运行以下纵向分析,每一列有以下结构:
nutrition: factor with 2 levels
fertlizer: factor with2 levels
time: factor with 10 levels
replicates: num 0,1,2,3...
growth: num 6, 7, 5 ...
addition: factor with 2 levels
lmer(growth ~ nutrition + fertlizer + time + addition + (1|replicates))
lmer(生长~营养+ fertlizer +时间+添加+(1|复制)
I get an errror message saying that fixed effects model is rank deficient so dropping x number of columns. Is there anyway around this problem? Are there suggestions to improve the way the model is written?
我得到一个错误消息,说固定效果模型有等级缺陷,所以减少x列。这个问题是否有解决的办法?是否有改进模型编写方式的建议?
2 个解决方案
1
I'm not 100% sure on this, but I believe it should get you somewhere in the ballpark.
我不是百分之百的肯定,但我相信它会让你在这个问题上有所收获。
dtf <- structure(list(nutr = structure(c(2L, 2L, 1L, 1L, 2L, 2L,
1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L), .Label = c("bad", "good"
), class = "factor"), fert = structure(c(2L, 1L, 2L, 1L, 2L,
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L), .Label = c("N",
"0"), class = "factor"), id = c(1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16), t0 = c(7, 6, 3, 20, 13, 4, 14, 9,
15, 5, 18, 19, 8, 1, 10, 16), t1 = c(12, 9, 3, 20, 4, 7, 6, 17,
19, 5, 18, 8, 15, 16, 10, 2), t2 = c(12, 9, 3, 20, 4, 7, 6, 17,
7, 6, 3, 20, 13, 4, 14, 9), t3 = c(15, 5, 18, 19, 8, 1, 10, 16,
4, 7, 6, 17, 7, 6, 3, 20), t4 = c(6, 7, 12, 4, 7, 18, 9, 10,
2, 10, 11, 14, 15, 1, 14, 16), t5 = c(4, 7, 6, 17, 7, 6, 3, 20,
15, 5, 18, 19, 8, 1, 10, 16), t6 = c(70, 5, 16, 31, 61, 14, 22,
23, 80, 13, 24, 32, 90, 16, 28, 29), t7 = c(56, 16, 7, 8, 78,
26, 28, 30, 91, 5, 8, 19, 67, 16, 18, 19), t8 = c(88, 21, 20,
19, 90, 16, 18, 19, 57, 3, 20, 4, 7, 67, 13, 12), t9 = c(62,
12, 15, 27, 71, 20, 4, 7, 72, 6, 3, 20, 73, 14, 9, 15), t10 = c(40,
13, 7, 19, 50, 3, 20, 7, 66, 14, 9, 15, 80, 16, 18, 19)), .Names = c("nutr",
"fert", "id", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
"t8", "t9", "t10"), row.names = c(NA, -16L), class = "data.frame")
# Need to reshape into long format so that each column is a separate variable
library(reshape2)
dtf.long <- reshape2::melt(dtf, id.vars=1:3, variable.name="time")
dtf.long$time <- as.integer(sub("t", "", dtf.long$time))
dtf.long$fert2 <- dtf.long$time > 5 & dtf.long$fert == "N"
library(lattice)
xyplot(value ~ time | nutr * fert, data=dtf.long )
library(lme4)
m1.1 <- lmer(value ~ nutr * fert2 * time + (1 | id), dtf.long, REML=FALSE)
m1.2 <- lmer(value ~ nutr * fert2 * time + (1 + time | id), dtf.long, REML=FALSE)
# The random slope term doesn't appear to be adding anything of value
anova(m1.1, m1.2)
These slides on longitudinal modelling in lme4
might be of use.
这些关于lme4纵向建模的幻灯片可能有用。