Как сделать взвешенный T-тест в R? - PullRequest
1 голос
/ 02 апреля 2020

У меня есть df1:

PopDens     Score1   Group
93.53455  17.985288   B
137.13861 10.549394   A
35.98619  13.392857   A
89.69800   8.644537   B
16.27796  29.591635   A
25.33346  21.081301   F
89.69800   2.644537   C
46.27796  29.591635   A
25.33346   5.081301   B
36.27796  29.591635   A
 1.33346   9.081301   B

Я хотел бы выполнить t-тест между группами A и B посмотрел на разницу в среднем score1.

Однако я хочу взвесить анализ так, чтобы строки с большим значением PopDens имели более сильный вес в анализе. Например, я не хочу, чтобы последняя строка имела такой же вес в анализе, как вторая, потому что плотности населения очень разные.

Как это сделать?

1 Ответ

1 голос
/ 02 апреля 2020

Ниже больше похоже на небольшое резюме моих мыслей и быстрый поиск. Я никогда раньше не использовал взвешенное t-тестирование, только веса в линейной регрессии.

Нет четкого определения того, что будет делать взвешенный t-тест. Вопрос заключается в том, как использовать весовые коэффициенты при оценке ошибки, потому что это основа вашего t-теста. Вы можете проверить это обсуждение и, возможно, этот документ о весах в линейной регрессии.

Итак, ваши данные:

df = structure(list(PopDens = c(93.53455, 137.13861, 35.98619, 89.698, 
16.27796, 25.33346, 89.698, 46.27796, 25.33346, 36.27796, 1.33346
), Score1 = c(17.985288, 10.549394, 13.392857, 8.644537, 29.591635, 
21.081301, 2.644537, 29.591635, 5.081301, 29.591635, 9.081301
), Group = structure(c(2L, 1L, 1L, 2L, 1L, 4L, 3L, 1L, 2L, 1L, 
2L), .Label = c("A", "B", "C", "F"), class = "factor")), class = "data.frame", row.names = c(NA, 
-11L))

Мы подмножество на только A и B:

df = subset(df,Group %in% c("A","B"))

И мы можем сравнить результаты t-теста и lm:

coefficients(summary(lm(Score1~ Group,data=df)))
             Estimate Std. Error   t value     Pr(>|t|)
(Intercept)  22.54343   3.653195  6.170881 0.0004580837
GroupB      -12.34532   5.479793 -2.252882 0.0589470215

t.test(df$Score1[df$Group=="B"],df$Score1[df$Group=="A"],data=df)

    Welch Two Sample t-test

data:  df$Score1[df$Group == "B"] and df$Score1[df$Group == "A"]
t = -2.404, df = 6.463, p-value = 0.05007
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -24.695931765   0.005282865
sample estimates:
mean of x mean of y 
 10.19811  22.54343

Вы получите p-значение 0,0589470215 для эффекта разницы B от A. Для t.test 0.05007, это не очень уж отличается.

Теперь для взвешенной линейной регрессии:

coefficients(summary(lm(Score1~ Group,data=df,weight=df$PopDens)))
             Estimate Std. Error    t value   Pr(>|t|)
(Intercept) 17.845885   3.780246  4.7208269 0.00215547
GroupB      -5.466244   5.727617 -0.9543663 0.37168503

Вы можете видеть, что коэффициенты оцениваются по-разному .. больше к образцам с большим весом.

Для взвешенного t-теста, предлагаемого в весах упаковки:

library(weights)
wtd.t.test(x=df$Score1[df$Group=="A"],y=df$Score1[df$Group=="B"],
weight=df$Score1[df$Group=="A"],weighty=df$Score1[df$Group=="B"],samedata=FALSE)
$test
[1] "Two Sample Weighted T-Test (Welch)"

$coefficients
   t.value         df    p.value 
2.90701563 6.97938063 0.02283172 

$additional
Difference     Mean.x     Mean.y   Std. Err 
 13.468496  25.884728  12.416232   4.633101 

Очевидно, это частотный вес в этом взвешенном t-тесте, но я не уверен , Если вы предпочитаете использовать это, будет полезно прочитать код подробно, поскольку не очень хорошо задокументировано, как рассчитываются стандартные ошибки и т. Д. c.

...