forked from XiangyunHuang/data-analysis-in-action
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpower-analysis.qmd
executable file
·196 lines (155 loc) · 5.12 KB
/
power-analysis.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# 统计检验的功效 {#sec-power-analysis}
```{r}
#| echo: false
source("_common.R")
```
::: hidden
$$
\def\bm#1{{\boldsymbol #1}}
$$
:::
## 三大检验方法
统计检验的一般方法。
### Wald 检验 {#sec-wald-test}
### Wilks 检验 {#sec-wilks-test}
也叫似然比检验
### Rao 检验 {#sec-rao-test}
也叫得分检验
## t 检验的功效
检验的功效常用于样本量的计算
`power.t.test()` 计算单样本或两样本的 t 检验的功效,或者根据功效计算参数,如样本量
```{r}
#| label: fig-power-t-test
#| fig-cap: "t 检验的功效"
#| fig-width: 5.5
#| fig-height: 3.5
#| dev: 'tikz'
#| fig-process: !expr to_png
#| code-fold: true
#| echo: !expr knitr::is_html_output()
library(ggplot2)
n <- 30 # 样本量(只是一个例子)
x <- seq(from = 0, to = 12, by = 0.01)
dat <- data.frame(xx = x / sqrt(n), yy = 2 * (1 - pt(x, n - 1)))
ggplot(data = dat, aes(x = xx, y = yy)) +
geom_line(linewidth = 1) +
geom_vline(xintercept = c(0.01, 0.2, 0.5, 0.8, 1.2, 2), linetype = 2) +
theme_classic(base_size = 13) +
labs(x = "$d = \\frac{t}{\\sqrt{n}}$",
y = "$2(1 - \\mathrm{pt}(x, n - 1))$")
```
```{r}
power.t.test(
n = 100, delta = 2.2,
sd = 1, sig.level = 0.05,
type = "two.sample",
alternative = "two.sided"
)
```
| 参数 | 含义 |
|:--------------|:-------------------------------------------------------|
| `n` | 每个组的样本量 |
| `delta` | 两个组的均值之差 |
| `sd` | 标准差,默认值 1 |
| `sig.level` | 显著性水平,默认是 0.05 (犯第 I 类错误的概率) |
| `power` | 检验的功效(1 - 犯第 II 类错误的概率) |
| `type` | t 检验的类型 `"two.sample"` 两样本、`"one.sample"` 单样本或 `"paired"` 配对样本 |
| `alternative` | 单边或双边检验,取值为 `"two.sided"` 或 `"one.sided"` |
: 函数 `power.t.test()` 的参数及其含义 {#tbl-power-t-test}
参数 `n`,`delta`,`power`,`sd` 和 `sig.level` 必须有一个值为 `NULL`,为 `NULL` 的参数是由其它参数决定的。
```{r}
# 前面 t 检验的等价功效计算
library(pwr)
pwr.t.test(
d = 2.2 / 6.4,
n = 100,
sig.level = 0.05,
type = "two.sample",
alternative = "two.sided"
)
```
sleep 数据集为例,计算功效
```{r}
# 分组计算均值
aggregate(data = sleep, extra ~ group, FUN = mean)
# 分组计算标准差
aggregate(data = sleep, extra ~ group, FUN = sd)
# 代入计算功效
power.t.test(
delta = 2.33 - 0.75, # 两组均值之差
sd = (2.002249 + 1.789010) / 2, # 标准差
sig.level = 0.05, # 显著性水平
type = "two.sample", # 两样本
power = 0.95, # 功效水平
alternative = "two.sided" # 双边检验
)
```
经检验,上面取两组的平均方差代替共同方差和下面精确计算的结果差不多。各组至少需要 39 个样本。**MKpower** 包精确计算 Welch t 检验的功效
```{r}
#| eval: false
library(MKpower)
power.welch.t.test(
delta = 2.33 - 0.75,
sd1 = 2.002249,
sd2 = 1.789010,
sig.level = 0.05,
power = 0.95,
alternative = "two.sided"
)
```
我国著名统计学家许宝騄先生对此功效计算方法做出过巨大贡献。
## 比例检验的功效
```{r}
# power.prop.test()
```
`power.prop.test()` 计算两样本比例检验的功效
功效可以用来计算实验所需要的样本量,检验统计量的功效越大/高,检验方法越好,实验所需要的样本量越少
```{r}
# p1 >= p2 的检验 单边和双边检验
power.prop.test(
p1 = .65, p2 = 0.6, sig.level = .05,
power = 0.90, alternative = "one.sided"
)
power.prop.test(
p1 = .65, p2 = 0.6, sig.level = .05,
power = 0.90, alternative = "two.sided"
)
```
**pwr** 包 `pwr.2p.test()` 函数提供了类似 `power.prop.test()` 函数的功能
```{r}
library(pwr)
# 明确 p1 > p2 的检验
# 单边检验拆分更加明细,分为大于和小于
pwr.2p.test(
h = ES.h(p1 = 0.65, p2 = 0.6),
sig.level = 0.05, power = 0.9, alternative = "greater"
)
```
已知两样本的样本量不等,检验 H_0: $p_1 = p_2$ H_1: $p_1 \neq p_2$ 的功效
```{r}
pwr.2p2n.test(
h = 0.30, n1 = 80, n2 = 245,
sig.level = 0.05, alternative = "greater"
)
```
h 表示两个样本的差异,计算得到的功效是 0.75
## 方差分析的功效
`power.anova.test()` 计算平衡的单因素方差分析检验的功效
```{r}
power.anova.test(
groups = 4, # 4 个组
between.var = 1, # 组间方差为 1
within.var = 3, # 组内方差为 3
power = 0.95 # 1 - 犯第二类错误的概率
)
```
```{r}
library(pwr)
# f 是如何和上面的组间/组内方差等价指定的
pwr.anova.test(
k = 4, # 组数
f = 0.5, # 效应大小
sig.level = 0.05, # 显著性水平
power = 0.95 # 检验的效
)
```