Я пишу этот пост, потому что застрял в анализе файла данных лабораторного эксперимента.

В этом эксперименте я подсчитал количество самок (небольшого членистоногого), присутствующих в определенной среде, в течение 26 временных точек (TP). Тем не менее, я хочу понять, было ли количество самок разным в каждый последующий момент времени (например, если количество самок, подсчитываемых в ТП 1, отличается от ТП 2; количество самок, учитываемых в ТП 2, отличается от ТП 3; и скоро...)

Фрейм данных имеет следующие столбцы:

Репликация (которые содержат номер реплики от 1 до 8); TimePoint (день, в который были подсчитаны самки, от 1 до 26); Женщины (количество женщин, подсчитываемых в каждый момент времени); и Блок (в эксперименте было 2 блока)

Я пробовал делать несколько последовательных контрастов, но не думаю, что это лучший способ. Это мой код:

   
m1<-lmer(Females~TimePoint+(1|Block))


 Suc_contrasts2<-glht(m1,linfct=mcp(TimePoint=
                               c(
                                 "t1 - t2 == 0",
                                 "t2 - t3 == 0",
                                 "t3 - t4 == 0",
                                 "t4 - t5 == 0",
                                 "t5 - t6 == 0",
                                 "t6 - t7 == 0",
                                 "t7 - t8 == 0",
                                 "t8 - t9 == 0",
                                 "t9 - t10 == 0",
                                 "t10 - t11== 0",
                                 "t11 - t12 == 0",
                                 "t12 - t13 == 0",
                                 "t13 - t14 == 0",
                                 "t14 - t15 == 0",
                                 "t15 - t16 == 0",
                                 "t16 - t17 == 0",
                                 "t17 - t18 == 0",
                                 "t18 - t19 == 0",
                                 "t19 - t20 == 0",
                                 "t20 - t21== 0",
                                 "t21 - t22 == 0",
                                 "t22 - t23 == 0",
                                 "t23 - t24 == 0",
                                 "t24 - t25 == 0",
                                 "t25 - t26 == 0")))


summary(Suc_contrasts2)


summary(Suc_contrasts2, test=adjusted ("bonferroni"))

Я искал в Google другие способы провести запланированные сравнения, но все, что я нашел, не совсем подходило для моего набора данных. Я все еще новичок в этом, так что извиняюсь за ошибку новичка. Таким образом, мой вопрос: есть ли лучший способ сравнить количество самок, которых я нашел между каждой парой последовательных временных точек?

Изменить 1:

Я тоже пробовал делать такие контрасты, но результаты не кажутся правильными ...


levels(TimePoint)

# [1] "t1"  "t10" "t11" "t12" "t13" "t14" "t15" "t16" "t17" "t18" "t19" "t2"  "t20" "t21" "t22" "t23" "t24" "t25" "t26"
# [20] "t3"  "t4"  "t5"  "t6"  "t7"  "t8"  "t9" 




# tell R which TimePoints to compare
c1<- c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) #1v2
c2<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0) #2v3
c3<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0) #3v4
c4<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0) #4v5
c5<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0) #5v6
c5<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0) #6v7
c6<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0) #7v8
c7<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1) #8v9
c8<- c(0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1) #9v10
c9<- c(0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) #10v11
c10<- c(0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) #11v12
c11<- c(0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) #11v12
c12<- c(0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) #12v13
c13<- c(0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) #13v14
c14<- c(0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) #14v15
c15<- c(0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) #15v16
c16<- c(0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) #16v17
c17<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) #17v18
c18<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) #18v19
c19<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) #19v20
c20<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) #20v21
c21<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) #21v22
c22<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) #22v23
c23<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0) #23v24
c24<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0) #24v25
c25<- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0) #25v26





# combined the above lines into a matrix
mat <- cbind(c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20,c21,c22,c23,c24,c25)



# tell R that the matrix gives the contrasts you want
contrasts(TimePoint) <- mat




model2 <- aov(Females ~ TimePoint)



summary(model2)

# Df Sum Sq Mean Sq F value Pr(>F)    
# line2$TimePoint  25   9694   387.8   6.939 <2e-16 ***
#   Residuals       390  21794    55.9                   
# ---
#   Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1






summary.aov(model2, split=list(TimePoint=list("1v2"=1, "2v3" = 2, "3v4"=3, "4v5"=4, "5v6"=5, "6v7"=6, "7v8"=7, "8v9"=8, "9v10"=9, "10v11"=10, "11v12"=11, "12v13"=12, "13v14"=13, "14v15"=14, "15v16"=15, "16v17"=16, "17v18"=17, "18v19"=18, "19v20"=19, "20v21"=20, "21v22"=21, "22v23"=22, "23v24"=23, "24v25"=24, "25v26"=25))) 

Спасибо за ваше время, Андре

0
None 28 Окт 2020 в 16:12

2 ответа

Лучший ответ

Думаю, этот веб-сайт поможет вам: обратное разностное кодирование

Следуя приведенной там информации, разница контрастов между последующими уровнями факторов может быть установлена ​​следующим образом (см. Ниже). Обратите внимание, что я использую только простой пример с 5 уровнями факторов.

#create dummy data
df <- expand.grid(TimePoint = c("t01", "t02", "t03", "t04", "t05"),
                  Replicate = 1:8, Block = 1:2)
set.seed(2)
df$Females <- runif(nrow(df), min = 0, max = 100)

#set backward difference contrasts
contrasts(df$TimePoint) <- matrix(c(-4/5, 1/5, 1/5, 1/5, 1/5,
                                    -3/5, -3/5, 2/5, 2/5, 2/5, 
                                    -2/5, -2/5, -2/5, 3/5, 3/5,
                                    -1/5, -1/5, -1/5, -1/5, 4/5), ncol = 4)

При подборе простой линейной модели оценки параметров соответствуют ожидаемым значениям, то есть контраст «TimePoint1» соответствует t2 - t1, контраст «TimePoint2» - t3 - t2 и так далее.

#fit linear model
m1 <- lm(Females ~  TimePoint, data = df)
coef(m1)

(Intercept)  TimePoint1  TimePoint2  TimePoint3  TimePoint4 
  50.295659  -10.116045    7.979465  -10.182389    2.209413 

#mean by time point
with(df, tapply(Females, TimePoint, mean))

     t01      t02      t03      t04      t05 
57.23189 47.11584 55.09531 44.91292 47.12233 

Я хочу добавить, что не уверен, разумно ли то, что вы пытаетесь сделать. Но мне неудобно оценивать это, и это будет вопрос для CrossValidated. Меня беспокоит, что рассматривать 26 временных точек как категориальные уровни факторов - не лучший вариант. Кроме того, в исходном коде вы, кажется, соответствуете модели, рассматривающей блок как случайный фактор. Это не имеет смысла, если блок имеет только 2 уровня (как вы пишете), см., Например, здесь: Ссылка

Наконец, я заметил, что в вашем примере уровни факторов вашей переменной TimePoint не упорядочены правильно (t1, t10, t11 ... вместо t1, t2, t3, ...). Вы можете изменить это, например, с помощью этой строки кода:

df$TimePoint <- factor(df$TimePoint, levels = paste0("t", 1:26),
                       labels = paste0("t", sprintf("%02d", 1:26)))
0
AndreasM 31 Окт 2020 в 14:40

Другой вариант подгонки контрастов последовательных разностей:

m1 <- lmer(Females~TimePoint+(1|Block), contrasts=list(TimePoint=MASS::contr.sdif))

При этом не принимается во внимание множественность тестирования (что может сойти с рук, поскольку это заранее запланированные контрасты): вы можете использовать p.adjust() для значений p.

Обязательно следует учитывать замечания @AndreasM об упорядочивании факторов, выборе случайных и фиксированных эффектов и т. Д.

1
Ben Bolker 31 Окт 2020 в 19:00