Функция glht в R дает разные результаты по сравнению с вычислениями, выполненными вручную - PullRequest
1 голос
/ 27 октября 2019

Я кодирую пример и сравниваю его с результатами, полученными вручную, однако результаты не соответствуют друг другу. Набор данных об исследовании, сравнивающем оценку для 3 различных обработок. Набор данных может быть воспроизведен следующим образом (для удобства перемаркирован).

Score = c(12, 11, 15, 11, 10, 13, 10, 4, 15, 16, 9, 14, 10, 6, 10, 8, 11, 12,
          12, 8,12, 9, 11, 15, 10, 15, 9, 13, 8, 12, 10, 8, 9, 5, 12,4, 6, 9, 4, 7, 7, 7,
          9, 12, 10, 11, 6, 3, 4, 9, 12, 7, 6, 8, 12, 12, 4, 12,13, 7, 10, 13, 9, 4, 4,
          10, 15, 9,5, 8, 6, 1, 0, 8, 12, 8, 7, 7, 1, 6, 7, 7, 12, 7, 9, 7, 9, 5, 11, 9, 5,
          6, 8,8, 6, 7, 10, 9, 4, 8, 7, 3, 1, 4, 3)

Treatment = c(rep("T1",35), rep("T2",33), rep("T3",37))

medicine = data.frame(Score, Treatment)

Мы можем получить групповые средства и ANOVA следующим образом:

> aggregate(medicine$Score ~ medicine$Treatment, FUN = mean)
  medicine$Treatment medicine$Score
1                 T1      10.714286
2                 T2       8.333333
3                 T3       6.513514

> anova.model = aov(Score ~ Treatment, dat = medicine)
> anova(anova.model)
Analysis of Variance Table

Response: Score
           Df Sum Sq Mean Sq F value    Pr(>F)    
Treatment   2 318.51 159.255   17.51 2.902e-07 ***
Residuals 102 927.72   9.095                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Предположим, что мы хотели провестиследующий тест гипотезы с использованием контраста:

# H0 : mu_1 = (mu_2 + mu_3) / 2
# Ha : mu_1 != (mu_2 + mu_3) / 2

, где != означает «не равно». Мы можем переписать гипотезы следующим образом:

# H0 : mu_1 - (mu_2)/2 - (mu_3)/2 = 0
# Ha : mu_1 - (mu_2)/2 - (mu_3)/2 != 0

Это дает нам коэффициенты контрастности c1 = 1, c2 = -1 / 2 и c3 = -1 / 2

Если Iиспользуя примерное средство для вычисления контрастной гамма-шляпы вручную, мы получаем

# gamma-hat = (c1)(x-bar_1) + (c2)(x-bar_2) + (c3)(x-bar_3)
# gamma-hat = (1)(10.714286) - (1/2)(8.333333) - (1/2)(6.513514) = 3.290862

Однако я не получаю этот результат, используя функцию glht() в библиотеке multcomp:

> # run code above
>
> library(multcomp)
>
> # declare contrast with coefficients corresponding to those in hypothesis test
> contrast = matrix(c(1, -1/2, -1/2), nrow = 1)
>
> # anova model declared earlier
> contrast.model = glht(anova.model , linfct = contrast)
> summary(contrast.model)

     Simultaneous Tests for General Linear Hypotheses

Fit: aov(formula = Score ~ Treatment, data = medicine)

Linear Hypotheses:
       Estimate Std. Error t value Pr(>|t|)    
1 == 0   14.005      1.082   12.95   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Adjusted p values reported -- single-step method)

Из полученного результата мы видим, что оценка gamma-hat равна 14,005, а не 3,290862, что является значением, полученным при расчете gamma-hat вручную. Я могу показать, что полученная стандартная ошибка также отличается от стандартной ошибки, рассчитанной вручную, если необходимо.

Я использовал ту же методику для другого набора данных, и результаты были согласованы при расчете вручную и с использованием * 1028. * поэтому я не уверен, где моя ошибка.

Может кто-нибудь, пожалуйста, помогите мне выяснить, где я ошибаюсь, с моим кодом или расчетом, пожалуйста?

1 Ответ

2 голосов
/ 27 октября 2019

14,005 правильно. Если вы посмотрите на соответствие вашей модели ановы, вы не включили перехват, поэтому в качестве эталона берется T1, а коэффициенты отражают, насколько разные группы отклоняются от среднего эталона (T1)

coefficients(anova.model)

он возвращает

(Intercept) TreatmentT2 TreatmentT3 
  10.714286   -2.380952   -4.200772

Например, T2, коэффициент равен -2,38, поскольку его среднее значение равно -2,38 + 10,712 = 8,3. Если вы вычисляете разницу, используя указанную вами контрастность:

coefficients(anova.model)%*%t(contrast)

Вы получаете ту же оценку, что и коэффициенты (контраст.модель).

Чтобы получить то, что вы хотели выше, вам нужно сделать:

anova.model = aov(Score ~ 0+Treatment, dat = medicine)
contrast.model <- glht(anova.model , linfct = contrast)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...