5 Eloszlások vizsgálata

5.1 Grafikus vizsgálatok a normalitásra

A normalitás ellenőrzésére tipikusan a hisztogramot, a simított hisztogramot és a QQ ábrát használhatjuk.

5.1.1 Példa: a szisztolés vérnyomás normalitása

Vizsgáljuk meg a szisztolés vérnyomás normalitását a teljes mintában, valamint az egészséges és magas vérnyomásban szenvedők körében.
Forrás: (Taeger and Kuhnt 2014)

Adatok beolvasása. Végezzük el az adatok beolvasását egy d adattáblába.

d <- read.table(file = textConnection("
no,status,mmhg
1,0,120
2,0,115
3,0,94
4,0,118
5,0,111
6,0,102
7,0,102
8,0,131
9,0,104
10,0,107
11,0,115
12,0,139
13,0,115
14,0,113
15,0,114
16,0,105
17,0,115
18,0,134
19,0,109
20,0,109
21,0,93
22,0,118
23,0,109
24,0,106
25,0,125
26,1,150
27,1,142
28,1,119
29,1,127
30,1,141
31,1,149
32,1,144
33,1,142
34,1,149
35,1,161
36,1,143
37,1,140
38,1,148
39,1,149
40,1,141
41,1,146
42,1,159
43,1,152
44,1,135
45,1,134
46,1,161
47,1,130
48,1,125
49,1,141
50,1,148
51,1,153
52,1,145
53,1,137
54,1,147
55,1,169
"), header=T, sep=",")
d$no     <- factor(d$no)
d$status <- factor(d$status, labels=c("egészséges", "magas vérnyomás"))
str(d)                       # az adattábla szerkezete
## 'data.frame':    55 obs. of  3 variables:
##  $ no    : Factor w/ 55 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ status: Factor w/ 2 levels "egészséges","magas vérnyomás": 1 1 1 1 1 1 1 1 1 1 ...
##  $ mmhg  : int  120 115 94 118 111 102 102 131 104 107 ...
d                            # a beolvasott adattábla
##    no          status mmhg
## 1   1      egészséges  120
## 2   2      egészséges  115
## 3   3      egészséges   94
## 4   4      egészséges  118
## 5   5      egészséges  111
## 6   6      egészséges  102
## 7   7      egészséges  102
## 8   8      egészséges  131
## 9   9      egészséges  104
## 10 10      egészséges  107
## 11 11      egészséges  115
## 12 12      egészséges  139
## 13 13      egészséges  115
## 14 14      egészséges  113
## 15 15      egészséges  114
## 16 16      egészséges  105
## 17 17      egészséges  115
## 18 18      egészséges  134
## 19 19      egészséges  109
## 20 20      egészséges  109
## 21 21      egészséges   93
## 22 22      egészséges  118
## 23 23      egészséges  109
## 24 24      egészséges  106
## 25 25      egészséges  125
## 26 26 magas vérnyomás  150
## 27 27 magas vérnyomás  142
## 28 28 magas vérnyomás  119
## 29 29 magas vérnyomás  127
## 30 30 magas vérnyomás  141
## 31 31 magas vérnyomás  149
## 32 32 magas vérnyomás  144
## 33 33 magas vérnyomás  142
## 34 34 magas vérnyomás  149
## 35 35 magas vérnyomás  161
## 36 36 magas vérnyomás  143
## 37 37 magas vérnyomás  140
## 38 38 magas vérnyomás  148
## 39 39 magas vérnyomás  149
## 40 40 magas vérnyomás  141
## 41 41 magas vérnyomás  146
## 42 42 magas vérnyomás  159
## 43 43 magas vérnyomás  152
## 44 44 magas vérnyomás  135
## 45 45 magas vérnyomás  134
## 46 46 magas vérnyomás  161
## 47 47 magas vérnyomás  130
## 48 48 magas vérnyomás  125
## 49 49 magas vérnyomás  141
## 50 50 magas vérnyomás  148
## 51 51 magas vérnyomás  153
## 52 52 magas vérnyomás  145
## 53 53 magas vérnyomás  137
## 54 54 magas vérnyomás  147
## 55 55 magas vérnyomás  169

Első lépésként végezzük el a normalitás ellenőrzését hisztogrammal, és QQ-ábrával. A középső képen a hisztogram mellett a simított hisztogramot és a mintából számolt paraméterekhez tartozó normális eloszlás görbéjét is berajzoltuk (a piros görbe).

par(mfrow=c(1,3))                              # a grafikus eszköz felosztása 1 sorra és 3 oszlopra
hist(d$mmhg)                                   # normalitás ellenőrzése hisztogrammal
hist(d$mmhg, freq = F); lines(density(d$mmhg)) # normalitás ellenőrzése hisztogrammal, és simított gyakorásgi görbével
curve(dnorm(x,mean = mean(d$mmhg), sd = sd(d$mmhg)), add = T, col = "red")
qqnorm(d$mmhg);qqline(d$mmhg)                  # normalitás ellenőrzése QQ-ábrával 

par(mfrow=c(1,1))                              # az alapértelmezett felosztás visszaállítása a grafikus eszközön

Az egészségesek és a magas vérnyomásban szenvedők csoportjában is végezzük el a fenti grafikus vizsgálatokat.

library(ggplot2)
library(PASWR2)
range.x <- range(d$mmhg)                                                   # a közös x tengely miatt
plots <- lapply(X = split(d, d$status), FUN = function(x) {
  ggplot(x, aes(x=mmhg)) + geom_histogram(aes(y = ..density..), binwidth = 10,  right = F, fill="white", colour = "black") + geom_density() + facet_grid(status ~ .) + stat_function( fun = dnorm, args = list(mean = mean(x$mmhg), sd = sd(x$mmhg)), colour = "red") + theme_bw() + coord_cartesian(xlim = range.x)
})
multiplot(plotlist = plots, cols = 1)                                      # ábrák rajzolása

library(ggplot2)
library(PASWR2)
p1 <- ggplot(d, aes(sample = mmhg)) +  stat_qq() +  facet_grid(status ~ .) + theme_bw()      # QQ-ábrák
p2 <- ggplot(d, aes(x=mmhg)) + geom_density(aes(fill=status), size=1, alpha=.5) + theme_bw() # simított hisztogramok
multiplot(p1, p2, cols = 2)                                                                  # ábrák rajzolása

A fenti ábrák alapján azt állapíthatjuk meg, hogy a teljes mintára vonatkozó normalitás sérülhet, a két csoportban azonban a normális eloszlást nagy biztonsággal feltételezhetjük.

5.2 Normalitás ellenőrzése ferdeségi és csúcsossági együtthatókkal

A normalitás ellenőrzése alapozható a két alakmutatóra is, a ferdeségi és a csúcsossági együtthatóra, amelyek értéke normális eloszlás esetén nullával egyenlő. Kiszámításukra több módszer is ismert, ezeket lentebb ismertetjük.

A ferdeségi együttható néhány értelmezése:

  1. \(\gamma_1 = \frac{m_3}{m_2^{3/2}}\), ahol \(m_1=\frac{\sum_{j=1}^{n}X_j}{n}\), \(m_i=\frac{\sum_{j=1}^{n}(X_j-m_1)^i}{n}\), \(i={2, 3, 4}\)
  2. \(G_1 = \gamma_1 \frac{\sqrt{n(n-1)}}{n-2}\)
  3. \(b_1 = \frac{m_3}{s^3} = \gamma_1 \left(\frac{n-1}{n}\right)^{3/2}\)

A csúcsossági együtthatóra is több számolási mód adható:

  1. \(\gamma_2 = \frac{m_4}{m_2^2} - 3\)
  2. \(G_2 = \frac{((n+1) \gamma_2 + 6)(n-1) }{ (n-2)(n-3)}\)
  3. \(b_2 = \frac{m_4}{s^4} - 3 = (\gamma_2 + 3) (1 - \frac{1}{n})^2 - 3\)

A standard hiba aszimptotikus kiszámítása a ferdeségi és csúcsossági együttható esetén:

\[ASE.skew = \sqrt{ \frac{6n(n-1)}{(n-2)(n+1)(n+3)} }\] \[ASE.kurt = \sqrt{ \frac{n^2 - 1}{(n-3)(n+5)} }\]

A standard hiba egyszerűsített számítása:

\[SE.skew = \sqrt{ \frac{6}{n} }\] \[SE.kurt = \sqrt{ \frac{24}{n} }\]

5.2.1 Példa: a szisztolés vérnyomás normalitása

Vizsgáljuk meg a szisztolés vérnyomás normalitását a teljes mintában, valamint az egészséges és magas vérnyomásban szenvedők körében.
Forrás: (Taeger and Kuhnt 2014)

Adatok beolvasása. Végezzük el az adatok beolvasását egy d adattáblába.

d <- read.table(file = textConnection("
no,status,mmhg
1,0,120
2,0,115
3,0,94
4,0,118
5,0,111
6,0,102
7,0,102
8,0,131
9,0,104
10,0,107
11,0,115
12,0,139
13,0,115
14,0,113
15,0,114
16,0,105
17,0,115
18,0,134
19,0,109
20,0,109
21,0,93
22,0,118
23,0,109
24,0,106
25,0,125
26,1,150
27,1,142
28,1,119
29,1,127
30,1,141
31,1,149
32,1,144
33,1,142
34,1,149
35,1,161
36,1,143
37,1,140
38,1,148
39,1,149
40,1,141
41,1,146
42,1,159
43,1,152
44,1,135
45,1,134
46,1,161
47,1,130
48,1,125
49,1,141
50,1,148
51,1,153
52,1,145
53,1,137
54,1,147
55,1,169
"), header=T, sep=",")
d$no     <- factor(d$no)
d$status <- factor(d$status, labels=c("egészséges", "magas vérnyomás"))
str(d)                       # az adattábla szerkezete
## 'data.frame':    55 obs. of  3 variables:
##  $ no    : Factor w/ 55 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ status: Factor w/ 2 levels "egészséges","magas vérnyomás": 1 1 1 1 1 1 1 1 1 1 ...
##  $ mmhg  : int  120 115 94 118 111 102 102 131 104 107 ...
d                            # a beolvasott adattábla
##    no          status mmhg
## 1   1      egészséges  120
## 2   2      egészséges  115
## 3   3      egészséges   94
## 4   4      egészséges  118
## 5   5      egészséges  111
## 6   6      egészséges  102
## 7   7      egészséges  102
## 8   8      egészséges  131
## 9   9      egészséges  104
## 10 10      egészséges  107
## 11 11      egészséges  115
## 12 12      egészséges  139
## 13 13      egészséges  115
## 14 14      egészséges  113
## 15 15      egészséges  114
## 16 16      egészséges  105
## 17 17      egészséges  115
## 18 18      egészséges  134
## 19 19      egészséges  109
## 20 20      egészséges  109
## 21 21      egészséges   93
## 22 22      egészséges  118
## 23 23      egészséges  109
## 24 24      egészséges  106
## 25 25      egészséges  125
## 26 26 magas vérnyomás  150
## 27 27 magas vérnyomás  142
## 28 28 magas vérnyomás  119
## 29 29 magas vérnyomás  127
## 30 30 magas vérnyomás  141
## 31 31 magas vérnyomás  149
## 32 32 magas vérnyomás  144
## 33 33 magas vérnyomás  142
## 34 34 magas vérnyomás  149
## 35 35 magas vérnyomás  161
## 36 36 magas vérnyomás  143
## 37 37 magas vérnyomás  140
## 38 38 magas vérnyomás  148
## 39 39 magas vérnyomás  149
## 40 40 magas vérnyomás  141
## 41 41 magas vérnyomás  146
## 42 42 magas vérnyomás  159
## 43 43 magas vérnyomás  152
## 44 44 magas vérnyomás  135
## 45 45 magas vérnyomás  134
## 46 46 magas vérnyomás  161
## 47 47 magas vérnyomás  130
## 48 48 magas vérnyomás  125
## 49 49 magas vérnyomás  141
## 50 50 magas vérnyomás  148
## 51 51 magas vérnyomás  153
## 52 52 magas vérnyomás  145
## 53 53 magas vérnyomás  137
## 54 54 magas vérnyomás  147
## 55 55 magas vérnyomás  169

Alakmutatók kiszámolása. A ferdeségi és csúcsossági együtthatókat a DescTools csomag Skew() és Kurt() függvényével is kiszámolhatjuk. A különböző mutatók értékét a method= argumentum megadásával számolhatjuk ki (method=1 esetén a \(\gamma_1\) és \(\gamma_2\), a method=2 a \(G_1\) és \(G_2\), a method=3 pedig a \(b_1\) és \(b_2\) mutatókat számolja). A conf.level= argumentum megadásával adott megbízhatósági szinten konfidenciaintervallumot készíthetünk a populációbeli paraméterekre. A konfidenciaintervallumok határai a két függvényben alapértelmezés szerint a bootstrap eljárással készülnek.

Első lépésben számoljuk ki a teljes mintában az alakmutatókat:

library(DescTools)
DescTools::Skew(d$mmhg, conf.level = 0.95, method = 1)  # a ferdeség hagyományos, tankönyvi definíciója
##        skew      lwr.ci      upr.ci 
## -0.08008799 -0.49612203  0.35835211
DescTools::Skew(d$mmhg, conf.level = 0.95, method = 2)  # ferdeség a SAS és SPSS programcsomagokban
##        skew      lwr.ci      upr.ci 
## -0.08235117 -0.60347390  0.32393525
DescTools::Skew(d$mmhg, conf.level = 0.95, method = 3)  # ferdeség a MINITAB és BMDP programcsomagokban
##        skew      lwr.ci      upr.ci 
## -0.07791373 -0.49382762  0.42055716
DescTools::Kurt(d$mmhg, conf.level = 0.95, method = 1)  # a csúcsosság hagyományos, tankönyvi definíciója
##       kurt     lwr.ci     upr.ci 
## -1.0588047 -1.3778092 -0.5580666
DescTools::Kurt(d$mmhg, conf.level = 0.95, method = 2)  # csúcsosság a SAS és SPSS programcsomagokban
##      kurt    lwr.ci    upr.ci 
## -1.044204 -1.399506 -0.452023
DescTools::Kurt(d$mmhg, conf.level = 0.95, method = 3)  # csúcsosság a MINITAB és BMDP programcsomagokban
##       kurt     lwr.ci     upr.ci 
## -1.1287519 -1.4527139 -0.6185631

Alakmutatók értékelése. A fenti outputból kiolvashatjuk a különböző ferdeségi és csúcsossági együtthatók értékét. Az értékelést a 3. típus (method = 3) alapján végzünk el. A ferdeségi együttható értéke \(b_1=-0,078\), a 95%-os megbízhatóságú konfidenciaintervallum határai tartalmazzák a nullát, így a ferdeségre vonatkozó ellenhipotézist nem tudjuk elfogadni. A csúcsossági együttható \(b_2=-1.129\), a 95%-os konfidenciaintervallum pedig nem tartalmazza a nullát, amely a csúcsosságra vonatkozó ellenhipotézis elfogadását jelenti. Ezek alapján azt mondhatjuk, hogy a változó eloszlása a csúcsossági paraméterre vonatkozó 95%-os konnfidenciaintervallum alapján eltér a normális eloszlástól.

Az egyes csoportokra is meghatározzuk a ferdeségi és csúcsossági együtthatókat. Most csak a \(b_1\) és \(b_2\) mutatókat számoljuk ki:

by(d$mmhg, d$status, DescTools::Skew, conf.level = 0.95, method = 3)
## d$status: egészséges
##       skew     lwr.ci     upr.ci 
##  0.4675099 -0.1677403  1.2485703 
## -------------------------------------------------------- 
## d$status: magas vérnyomás
##       skew     lwr.ci     upr.ci 
## -0.1011255 -0.7803134  0.7719545
by(d$mmhg, d$status, DescTools::Kurt, conf.level = 0.95, method = 3)
## d$status: egészséges
##       kurt     lwr.ci     upr.ci 
## -0.1037284 -1.0393472  1.7619865 
## -------------------------------------------------------- 
## d$status: magas vérnyomás
##        kurt      lwr.ci      upr.ci 
## -0.02156674 -0.84692168  1.66162622

Az egyes mutatók leolvashatók a fenti outputból, a 95%-os konfidenciaintervallumok mindegyike tartalmazza a nulla értéket, amelyek így a normalitást támogatják.

Alternatívák alakmutatók számítására. Az R-ben számos függvény létezik a fenti mutatók kiszámítására. A pastecs csomag stat.desc() függvénye más mutatók mellett a ferdeségi és a csúcsossági mutatót is szolgáltatja a norm=T argumentum megadása után. A stat.desc() függvény a \(b_1\) és \(b_2\) értékeket számolja ki. Az outputban a skew.2SE és kurt.2SE címkével jelzett értékek is szerepelnek, melyek számítási módja: \(skew.2SE = \frac{b_1}{2ASE.skew}\), \(kurt.2SE = \frac{b_2}{2ASE.kurt}\). Ha ezek a mutatók -1 és +1 között vannak, akkor támogatják a változó normalitását.

library(pastecs)
stat.desc(d$mmhg, norm = T, basic = F, desc = F)
##    skewness    skew.2SE    kurtosis    kurt.2SE  normtest.W  normtest.p 
## -0.07791373 -0.12108103 -1.12875193 -0.89087549  0.96077467  0.07011906

A QuantPsyc csomag Skew(), Kurt() és norm() függvényei a \(G_1\) és \(G_2\) mutatókat szolgáltatják. Az SE oszlopban az SE.skew, illetve SE.kurt értékek olvashatók, a t oszlopban a két előző érték hányadosa, és a hozzá tartozó p érték a standard normális eloszlás alapján.

library(QuantPsyc)
QuantPsyc::Skew(d$mmhg)
##               sk     se.sk       t.sk      p.sk
## [1,] -0.08235117 0.3302891 -0.2493305 0.4015526
QuantPsyc::Kurt(d$mmhg)
##             ku     se.ku      t.ku       p.ku
## [1,] -1.044204 0.6605783 -1.580742 0.05696853
QuantPsyc::norm(d$mmhg)
##            Statistic        SE      t-val          p
## Skewness -0.08235117 0.3302891 -0.2493305 0.40155256
## Kurtosis -1.04420373 0.6605783 -1.5807419 0.05696853

5.3 D’Agostino–Pearson-próba

A D’Agostino–Pearson-próba a ferdeségi és a csúcsossági együtthatók alapján a változó normalitására vonatkozó nullhipotézist teszteli.

Alkalmazási feltételek:

  • folytonos eloszlású \(X\) változó

Null- és ellenhipotézisek:

  • Nullhipotézis:
    • \(H_0: X\) normális eloszlású
  • Ellenhipotézis:
    • \(H_1: X\) nem normális eloszlású

Próbastatisztika:

A ferdeségre vonatkozó Z3 próbastatisztika a nullhipotézis igaz volta esetén standard normális eloszlást követ. Kiszámítása:

\[Y= \gamma_1 \sqrt{\frac{(n + 1)(n + 3)}{(6 (n - 2))}}, \beta_2(\gamma_1) = \frac{3 (n^2 + 27 n - 70) (n + 1) (n + 3)}{(n - 2) (n + 5) (n + 7) (n + 9)}\] \[W= \sqrt{-1 + \sqrt{2 (\beta_2(\gamma_1) - 1)}}, \delta = \frac{1}{\sqrt{\ln(W)}}, \alpha = \sqrt{\frac{2}{W^2 - 1}}\] \[Z3= \delta \ln\left(\frac{Y}{\alpha} + \sqrt{\left(\frac{Y}{\alpha}\right)^2 + 1}\right) \sim N(0,1)\]

A csúcsosságra vonatkozó Z4 próbastatisztika szintén standard normális eloszlású, ha \(H_0\) igaz. Ennek is megadjuk a kiszámítását:

\[\gamma_2 = \gamma_2 + 3, \mu(\gamma_2) = \frac{3 (n - 1)}{n + 1}, \sigma(\gamma_2) = \frac{24 n (n - 2) (n - 3)}{(n + 1)^2 (n + 3) (n + 5)}, x = \frac{\gamma_2 - \mu(\gamma_2)}{\sqrt(\sigma(\gamma_2))}\] \[\beta_1(\gamma_2) = \frac{6 (n^2 - 5n + 2)}{(n + 7) (n + 9)} \sqrt{\frac{6 (n + 3) (n + 5)}{n (n - 2) (n - 3)}}, A = 6 + \frac{8}{\beta_1(\gamma_2)} \left(\frac{2}{\beta_1(\gamma_2)} + \sqrt{1 + \frac{4}{\beta_1(\gamma_2)^2}}\right)\] \[Z4 = \frac{(1 - \frac{2}{9 * A}) - \left(\frac{1 - \frac{2}{A}}{1 + x\sqrt{\frac{2}{A - 4}}}\right)^\frac{1}{3}}{\sqrt{\frac{2}{9A}}} \sim N(0,1)\]

A D’Agostino–Pearson-próba \(\chi^2\) próbastatisztikája a fenti \(Z3\) és \(Z4\) értékeken alapul:

\[\chi^2 = Z3^2 + Z4^2 \sim \chi^2(2)\]

5.3.1 Példa: a szisztolés vérnyomás normalitása

Vizsgáljuk meg a szisztolés vérnyomás normalitását a teljes mintában, és az egészséges és magas vérnyomásban szenvedők körében is.
Forrás: (Taeger and Kuhnt 2014)

Adatok beolvasása. Végezzük el az adatok beolvasását egy d adattáblába.

d <- read.table(file = textConnection("
no,status,mmhg
1,0,120
2,0,115
3,0,94
4,0,118
5,0,111
6,0,102
7,0,102
8,0,131
9,0,104
10,0,107
11,0,115
12,0,139
13,0,115
14,0,113
15,0,114
16,0,105
17,0,115
18,0,134
19,0,109
20,0,109
21,0,93
22,0,118
23,0,109
24,0,106
25,0,125
26,1,150
27,1,142
28,1,119
29,1,127
30,1,141
31,1,149
32,1,144
33,1,142
34,1,149
35,1,161
36,1,143
37,1,140
38,1,148
39,1,149
40,1,141
41,1,146
42,1,159
43,1,152
44,1,135
45,1,134
46,1,161
47,1,130
48,1,125
49,1,141
50,1,148
51,1,153
52,1,145
53,1,137
54,1,147
55,1,169
"), header=T, sep=",")
d$no     <- factor(d$no)
d$status <- factor(d$status, labels=c("egészséges", "magas vérnyomás"))
str(d)                       # az adattábla szerkezete
## 'data.frame':    55 obs. of  3 variables:
##  $ no    : Factor w/ 55 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ status: Factor w/ 2 levels "egészséges","magas vérnyomás": 1 1 1 1 1 1 1 1 1 1 ...
##  $ mmhg  : int  120 115 94 118 111 102 102 131 104 107 ...
d                            # a beolvasott adattábla
##    no          status mmhg
## 1   1      egészséges  120
## 2   2      egészséges  115
## 3   3      egészséges   94
## 4   4      egészséges  118
## 5   5      egészséges  111
## 6   6      egészséges  102
## 7   7      egészséges  102
## 8   8      egészséges  131
## 9   9      egészséges  104
## 10 10      egészséges  107
## 11 11      egészséges  115
## 12 12      egészséges  139
## 13 13      egészséges  115
## 14 14      egészséges  113
## 15 15      egészséges  114
## 16 16      egészséges  105
## 17 17      egészséges  115
## 18 18      egészséges  134
## 19 19      egészséges  109
## 20 20      egészséges  109
## 21 21      egészséges   93
## 22 22      egészséges  118
## 23 23      egészséges  109
## 24 24      egészséges  106
## 25 25      egészséges  125
## 26 26 magas vérnyomás  150
## 27 27 magas vérnyomás  142
## 28 28 magas vérnyomás  119
## 29 29 magas vérnyomás  127
## 30 30 magas vérnyomás  141
## 31 31 magas vérnyomás  149
## 32 32 magas vérnyomás  144
## 33 33 magas vérnyomás  142
## 34 34 magas vérnyomás  149
## 35 35 magas vérnyomás  161
## 36 36 magas vérnyomás  143
## 37 37 magas vérnyomás  140
## 38 38 magas vérnyomás  148
## 39 39 magas vérnyomás  149
## 40 40 magas vérnyomás  141
## 41 41 magas vérnyomás  146
## 42 42 magas vérnyomás  159
## 43 43 magas vérnyomás  152
## 44 44 magas vérnyomás  135
## 45 45 magas vérnyomás  134
## 46 46 magas vérnyomás  161
## 47 47 magas vérnyomás  130
## 48 48 magas vérnyomás  125
## 49 49 magas vérnyomás  141
## 50 50 magas vérnyomás  148
## 51 51 magas vérnyomás  153
## 52 52 magas vérnyomás  145
## 53 53 magas vérnyomás  137
## 54 54 magas vérnyomás  147
## 55 55 magas vérnyomás  169

A D’Agostino–Pearson-próba végrehajtása. A D’Agostino–Pearson-próba végrehajtását az fBasics csomag dagoTest() függvényével kezdeményezhetjük. Egyetlen paramétere a numerikus adatminta. A próbát elvégezzük a teljes mintára és a két csoportra is (egészségesek és magas vérnyomásúak csoportja).

library(fBasics)
dagoTest(x = d$mmhg)                             # D'Agostino--Pearson-próba a teljes mintára
## 
## Title:
##  D'Agostino Normality Test
## 
## Test Results:
##   STATISTIC:
##     Chi2 | Omnibus: 7.802
##     Z3  | Skewness: -0.268
##     Z4  | Kurtosis: -2.7803
##   P VALUE:
##     Omnibus  Test: 0.02022 
##     Skewness Test: 0.7887 
##     Kurtosis Test: 0.00543 
## 
## Description:
##  Wed May 18 23:11:26 2016 by user: kali2
library(fBasics)
by(d$mmhg, d$status, dagoTest)                   # D'Agostino--Pearson-próba a két csoportra
## 
## Title:
##  D'Agostino Normality Test
## 
## Test Results:
##   STATISTIC:
##     Chi2 | Omnibus: 1.9236
##     Z3  | Skewness: 1.1804
##     Z4  | Kurtosis: 0.7282
##   P VALUE:
##     Omnibus  Test: 0.3822 
##     Skewness Test: 0.2378 
##     Kurtosis Test: 0.4665 
## 
## Description:
##  Wed May 18 23:11:26 2016 by user: kali2
## 
## -------------------------------------------------------- 
## 
## Title:
##  D'Agostino Normality Test
## 
## Test Results:
##   STATISTIC:
##     Chi2 | Omnibus: 0.6472
##     Z3  | Skewness: -0.2782
##     Z4  | Kurtosis: 0.7548
##   P VALUE:
##     Omnibus  Test: 0.7236 
##     Skewness Test: 0.7809 
##     Kurtosis Test: 0.4504 
## 
## Description:
##  Wed May 18 23:11:26 2016 by user: kali2

A D’Agostino–Pearson-próba értékelése. A D’Agostino–Pearson-próba értékelését most a teljes mintára nézve végezzük el. A normalitás ellenőrzésére végrehajtott D’Agostino–Pearson-próba eredménye alapján, a normális eloszlásra vonatkozó nullhipotézist visszautasítjuk (\(\chi^2(2)=7,802\); \(p=0,0202\)). A normális eloszlástól való eltérés az alakmutatók alapján nem a szimmetrikus tulajdonságon (\(Z3=-0,268\); \(p=0,7887\)), hanem inkábba a csúcsosságon múlik (\(Z4=-2,7803\); \(p=0,0054\)).

A D’Agostino–Pearson-próba kézi számolása. A D’Agostino–Pearson-próba outputjában szereplő próbastatisztika értékeket magunk is kiszámolhatjuk:

n   <- sum(!is.na(d$mmhg))                                # mintaelemszám
m.1 <- sum(d$mmhg)/n                                      # 1. momentum, mintaátlag
m.2 <- sum((d$mmhg-m.1)^2)/n                              # 2. momentum, variancia
m.3 <- sum((d$mmhg-m.1)^3)/n                              # 3. momentum
m.4 <- sum((d$mmhg-m.1)^4)/n                              # 4. momentum
gamma.1 <- m.3/m.2^(3/2)                                  # ferdeségi mutató, gamma1
gamma.2 <- (m.4/m.2^2)-3                                  # csúcsossági mutató, gamma2
gamma.1                                                   # ferdeségi mutató, gamma1 kiíratása
## [1] -0.08008799
gamma.2                                                   # csúcsossági mutató, gamma2 kiíratása
## [1] -1.058805
# Z3 számolása
Y     <- gamma.1 * sqrt((n + 1) * (n + 3) / (6 * (n - 2)))
b2ng1 <- (3 * (n^2 + 27 * n - 70) * (n + 1) * (n + 3)) / ((n - 2) * (n + 5) * (n + 7) * (n + 9))
W     <- sqrt(-1 + sqrt(2 * (b2ng1 - 1)))
delta <- 1 / sqrt(log(W))
alfa  <- sqrt(2 / (W^2 - 1))
Z3    <- delta * log(Y / alfa + sqrt((Y / alfa)^2 + 1))  # Z3 próbastatisztika a ferdeségi próbához
Z3                                                       # Z3 próbastatisztika kiíratása
## [1] -0.2680036
# Z4 számolása
gamma.2 <- gamma.2 + 3
Eg2     <- 3 * (n - 1) / (n + 1)
varg2   <- (24 * n * (n - 2) * (n - 3)) / ((n + 1)^2 * (n + 3) * (n + 5))
x       <- (gamma.2 - Eg2) / sqrt(varg2)
ngbg2   <- (6 * (n^2 - 5 * n + 2)) / ((n + 7) * (n + 9)) * sqrt((6 * (n + 3) * (n + 5)) / (n * (n - 2) * (n - 3)))
A       <- 6 + 8/ngbg2 * (2/ngbg2 + sqrt(1 + 4/ngbg2^2))
# Z4 próbastatisztika a csúcsossági próbához
Z4      <- ((1 - 2/(9 * A)) - ((1 - 2/A)/(1 + x*sqrt(2/(A - 4))))^(1/3))/sqrt(2/(9 * A)) 
Z4                                                                            # Z4 próbastatisztika kiírása
## [1] -2.780328
# Chi2 számolása
Chi2 <- Z3^2 + Z4^2                                       # Chi2 próbastatisztika a D'Agostino--Pearson-próbához
Chi2                                                      # Chi2 próbastatisztika kiírása
## [1] 7.802048
2 * pnorm (q = Z3, lower.tail = TRUE)                     # p érték a Z3 ferdeségi próbastatisztikához
## [1] 0.7886965
2 * pnorm (q = Z4, lower.tail = TRUE)                     # p érték a Z4 csúcsossági próbastatisztikához
## [1] 0.005430407
pchisq(q = Chi2, df = 2, lower.tail = FALSE)              # p érték a Chi2 normalitási próbastatisztikához
## [1] 0.02022119

Alternatívák a D’Agostino–Pearson-próbára. A D’Agostino–Pearson-próba outputjában a ferdeségi és csúcsossági próbastatisztika értékek (Z3 és Z4), és a hozzájuk tartozó p értékek is szerepelnek. A moments csomag agostino.test() és anscombe.test() függvényeivel a ferdeségre vonatkozó D’Agostino-próba és a csúcsosságra vonatkozó Anscombe–Glynn-próba külön-külön is végrehajtható:

library(moments)
agostino.test(x = d$mmhg)                          # D'Agostino-próba a ferdeségre
## 
##  D'Agostino skewness test
## 
## data:  d$mmhg
## skew = -0.080088, z = -0.268000, p-value = 0.7887
## alternative hypothesis: data have a skewness
anscombe.test(x = d$mmhg)                          # Anscombe-Glynn-próba a csúcsosságra
## 
##  Anscombe-Glynn kurtosis test
## 
## data:  d$mmhg
## kurt = 1.9412, z = -2.7803, p-value = 0.00543
## alternative hypothesis: kurtosis is not equal to 3

A két alakmutatót szintén együttesen veszi figyelembe a Jarque–Bera-próba, így alkalmas a \(H_0:\) a változó normális eloszlású a populációban és a \(H_1:\) a változó nem normális eloszlású a populációban hipotézisek tesztelésére. Ez utóbbi próba a nullhipotézis igaz volta mellett \(\chi^2(n-2)\) eloszlású próbastatisztikára vezet, így nagyobb mintaelemszám esetén érdemes használni. A próba alkalmazásának feltétele, hogy a vizsgált \(X\) változó folytonos eloszlású legyen. A Jarque–Bera-próba próbastatisztikája: \(LM=n\left(\frac{\gamma_1^2}{6}+\frac{(\gamma_2-3)^2}{24}\right)\)

library(DescTools)
JarqueBeraTest(d$mmhg, robust = FALSE)                    # Jarque-Bera-próba végrehajtása
## 
##  Jarque Bera Test
## 
## data:  d$mmhg
## X-squared = 2.6279, df = 2, p-value = 0.2688
jbTest(d$mmhg)
## 
## Attaching package: 'akima'
## The following object is masked from 'package:tolerance':
## 
##     interp
## 
## Title:
##  Jarque - Bera Normality Test
## 
## Test Results:
##   PARAMETER:
##     Sample Size: 55
##   STATISTIC:
##     LM: 2.628
##     ALM: 2.782
##   P VALUE:
##     LM p-value: 0.145 
##     ALM p-value: 0.171 
##     Asymptotic: 0.269 
## 
## Description:
##  Wed May 18 23:11:28 2016 by user: kali2
# A Jarque--Bera-próba kézi számítása
n   <- sum(!is.na(d$mmhg))                                # mintaelemszám
m.1 <- sum(d$mmhg)/n                                      # 1. momentum, mintaátlag
m.2 <- sum((d$mmhg-m.1)^2)/n                              # 2. momentum, variancia
m.3 <- sum((d$mmhg-m.1)^3)/n                              # 3. momentum
m.4 <- sum((d$mmhg-m.1)^4)/n                              # 4. momentum
gamma.1 <- m.3/m.2^(3/2)                                  # ferdeségi mutató, gamma1
gamma.2 <- (m.4/m.2^2)                                    # csúcsossági mutató, gamma2
LM <- n * (gamma.1^2 / 6 + (gamma.2 - 3)^2 / 24)          # Jarque--Bera-próba LM próbastatisztikája
LM                                                        # próbastatisztika kiírása
## [1] 2.627909
pchisq(q = LM, df = 2, lower.tail = FALSE)                # p érték az LM próbastatisztikához
## [1] 0.2687552

A Jarque–Bera-próba outputjából kiolvasható, hogy kevésbé érzékeny, mint a D’Agostino–Pearson-próba, hiszen a p érték alapján a nullhipotézist megtartjuk, azaz a változó normalitása a Jarque–Bera-próba eredménye szerint nem sérül (\(\chi^2=2,6279\); \(p=0,2688\)).

5.4 Shapiro–Wilk-próba

Ha azt szeretnénk vizsgálni, hogy a minta származhat-e normális eloszlású változóból, akkor a Shapiro–Wilk-próbát használhatjuk. (A normalitás ellenőrzésére a leginkább javasolt próba, ha kevés azonos érték fordul elő a mintában. Az SPSS hagyományosan ezt és a Kolmogorov–Szmirnov-próba Lilliefors változatát outputolja, és az a hagyomány alakult ki, hogy \(n<50\) esetén a Shapiro–Wilk-próba, ellenkező esetben a Lilliefors-próba eredményét tekintették.)

Alkalmazási feltételek:

  • legyen \(X\) intervallum vagy arány skálájú változó.

Null- és ellenhipotézisek:

  • Nullhipotézis:
    • \(H_0:\) a változó normális eloszlású a populációban
  • Ellenhipotézis:
    • \(H_1:\) a változó nem normális eloszlású a populációban

Próbastatisztika:

A próbastatisztikát \(W\)-vel jelöljük, amelyre teljesül, hogy \(0<W \leq 1\). A \(W\) eloszlása függ a minta méretétől (\(3 \leq n \leq 5000\)).

5.4.1 Példa: a szisztolés vérnyomás normalitása

Vizsgáljuk meg a szisztolés vérnyomás normalitását a teljes mintában, és az egészséges és magas vérnyomásban szenvedők körében is.
Forrás: (Taeger and Kuhnt 2014)

Adatok beolvasása. Végezzük el az adatok beolvasását egy d adattáblába.

d <- read.table(file = textConnection("
no,status,mmhg
1,0,120
2,0,115
3,0,94
4,0,118
5,0,111
6,0,102
7,0,102
8,0,131
9,0,104
10,0,107
11,0,115
12,0,139
13,0,115
14,0,113
15,0,114
16,0,105
17,0,115
18,0,134
19,0,109
20,0,109
21,0,93
22,0,118
23,0,109
24,0,106
25,0,125
26,1,150
27,1,142
28,1,119
29,1,127
30,1,141
31,1,149
32,1,144
33,1,142
34,1,149
35,1,161
36,1,143
37,1,140
38,1,148
39,1,149
40,1,141
41,1,146
42,1,159
43,1,152
44,1,135
45,1,134
46,1,161
47,1,130
48,1,125
49,1,141
50,1,148
51,1,153
52,1,145
53,1,137
54,1,147
55,1,169
"), header=T, sep=",")
d$no     <- factor(d$no)
d$status <- factor(d$status, labels=c("egészséges", "magas vérnyomás"))
str(d)                       # az adattábla szerkezete
## 'data.frame':    55 obs. of  3 variables:
##  $ no    : Factor w/ 55 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ status: Factor w/ 2 levels "egészséges","magas vérnyomás": 1 1 1 1 1 1 1 1 1 1 ...
##  $ mmhg  : int  120 115 94 118 111 102 102 131 104 107 ...
d                            # a beolvasott adattábla
##    no          status mmhg
## 1   1      egészséges  120
## 2   2      egészséges  115
## 3   3      egészséges   94
## 4   4      egészséges  118
## 5   5      egészséges  111
## 6   6      egészséges  102
## 7   7      egészséges  102
## 8   8      egészséges  131
## 9   9      egészséges  104
## 10 10      egészséges  107
## 11 11      egészséges  115
## 12 12      egészséges  139
## 13 13      egészséges  115
## 14 14      egészséges  113
## 15 15      egészséges  114
## 16 16      egészséges  105
## 17 17      egészséges  115
## 18 18      egészséges  134
## 19 19      egészséges  109
## 20 20      egészséges  109
## 21 21      egészséges   93
## 22 22      egészséges  118
## 23 23      egészséges  109
## 24 24      egészséges  106
## 25 25      egészséges  125
## 26 26 magas vérnyomás  150
## 27 27 magas vérnyomás  142
## 28 28 magas vérnyomás  119
## 29 29 magas vérnyomás  127
## 30 30 magas vérnyomás  141
## 31 31 magas vérnyomás  149
## 32 32 magas vérnyomás  144
## 33 33 magas vérnyomás  142
## 34 34 magas vérnyomás  149
## 35 35 magas vérnyomás  161
## 36 36 magas vérnyomás  143
## 37 37 magas vérnyomás  140
## 38 38 magas vérnyomás  148
## 39 39 magas vérnyomás  149
## 40 40 magas vérnyomás  141
## 41 41 magas vérnyomás  146
## 42 42 magas vérnyomás  159
## 43 43 magas vérnyomás  152
## 44 44 magas vérnyomás  135
## 45 45 magas vérnyomás  134
## 46 46 magas vérnyomás  161
## 47 47 magas vérnyomás  130
## 48 48 magas vérnyomás  125
## 49 49 magas vérnyomás  141
## 50 50 magas vérnyomás  148
## 51 51 magas vérnyomás  153
## 52 52 magas vérnyomás  145
## 53 53 magas vérnyomás  137
## 54 54 magas vérnyomás  147
## 55 55 magas vérnyomás  169

A Shapiro–Wilk-próba végrehajtása. Shapiro–Wilk-próbát a shapiro.test() függvénnyel hajthatunk végre. Ha csoportokra szeretnénk kérni normalitás-vizsgálatot, akkor használjuk a by() függvényt.

shapiro.test(x = d$mmhg)                            # Shapiro-Wilk-próba a teljes mintára
## 
##  Shapiro-Wilk normality test
## 
## data:  d$mmhg
## W = 0.96077, p-value = 0.07012
by(d$mmhg, d$status, shapiro.test)                  # Shapiro-Wilk-próba az egyes csoportokra
## d$status: egészséges
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.96052, p-value = 0.4249
## 
## -------------------------------------------------------- 
## d$status: magas vérnyomás
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.97971, p-value = 0.8179

A Shapiro–Wilk-próba értékelése. A Shapiro–Wilk-próba eredménye alapján azt mondhatjuk, hogy sem a teljes minta (\(W=0,96077; p=0,07\)), sem az egyes csoportok mintái (egészséges csoport: \(W=0,96052, p=0,4249\); magas vérnyomás csoport: \(W=0,979717, p=0,8179\)) nem sértik meg a normalitásra vonatkozó nullhipotézist.

Alternatívák a Shapiro–Wilk-próbára. A Shapiro–Wilk-próba egyszerűsített változata a Shapiro–Francia-próba, amelyet nagyobb mintaelemszámok esetén használhatunk.

library(DescTools)
ShapiroFranciaTest(d$mmhg)                          # Shapiro--Francia-próba a teljes mintára
## 
##  Shapiro-Francia normality test
## 
## data:  d$mmhg
## W = 0.96724, p-value = 0.1231
by(d$mmhg, d$status, ShapiroFranciaTest)            # Shapiro--Francia-próba az egyes csoportokra
## d$status: egészséges
## 
##  Shapiro-Francia normality test
## 
## data:  dd[x, ]
## W = 0.95938, p-value = 0.3412
## 
## -------------------------------------------------------- 
## d$status: magas vérnyomás
## 
##  Shapiro-Francia normality test
## 
## data:  dd[x, ]
## W = 0.97552, p-value = 0.6061

5.5 Kolmogorov–Szmirnov-próba

Eloszlás vizsgálatára az egymintás Kolmogorov–Szmirnov-próbát is használhatjuk, amely azt vizsgálja, hogy a minta vajon adott (pl. normális, Poisson, egyenletes, exponenciális stb.) eloszlású-e. Használata nagyobb mintaelemszám (\(n \geq 50\)) esetén javasolt.

Alkalmazási feltételek:

  • legyen \(X\) intervallum vagy arány skálájú változó.

Null- és ellenhipotézisek:

  • Nullhipotézis:
    • \(H_0:\) a változó normális eloszlású a populációban
  • Ellenhipotézis:
    • \(H_1:\) a változó nem normális eloszlású a populációban

Próbastatisztika:

A \(D\) próbastatisztika az elméleti és az empirikus eloszlásfüggvény közötti maximális eltérésén alapul.

5.5.1 Példa: a szisztolés vérnyomás normalitása

Vizsgáljuk meg a szisztolés vérnyomás normalitását a teljes mintában, és az egészséges és magas vérnyomásban szenvedők körében is.
Forrás: (Taeger and Kuhnt 2014)

Adatok beolvasása. Végezzük el az adatok beolvasását egy d adattáblába.

d <- read.table(file = textConnection("
no,status,mmhg
1,0,120
2,0,115
3,0,94
4,0,118
5,0,111
6,0,102
7,0,102
8,0,131
9,0,104
10,0,107
11,0,115
12,0,139
13,0,115
14,0,113
15,0,114
16,0,105
17,0,115
18,0,134
19,0,109
20,0,109
21,0,93
22,0,118
23,0,109
24,0,106
25,0,125
26,1,150
27,1,142
28,1,119
29,1,127
30,1,141
31,1,149
32,1,144
33,1,142
34,1,149
35,1,161
36,1,143
37,1,140
38,1,148
39,1,149
40,1,141
41,1,146
42,1,159
43,1,152
44,1,135
45,1,134
46,1,161
47,1,130
48,1,125
49,1,141
50,1,148
51,1,153
52,1,145
53,1,137
54,1,147
55,1,169
"), header=T, sep=",")
d$no     <- factor(d$no)
d$status <- factor(d$status, labels=c("egészséges", "magas vérnyomás"))
str(d)                       # az adattábla szerkezete
## 'data.frame':    55 obs. of  3 variables:
##  $ no    : Factor w/ 55 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ status: Factor w/ 2 levels "egészséges","magas vérnyomás": 1 1 1 1 1 1 1 1 1 1 ...
##  $ mmhg  : int  120 115 94 118 111 102 102 131 104 107 ...
d                            # a beolvasott adattábla
##    no          status mmhg
## 1   1      egészséges  120
## 2   2      egészséges  115
## 3   3      egészséges   94
## 4   4      egészséges  118
## 5   5      egészséges  111
## 6   6      egészséges  102
## 7   7      egészséges  102
## 8   8      egészséges  131
## 9   9      egészséges  104
## 10 10      egészséges  107
## 11 11      egészséges  115
## 12 12      egészséges  139
## 13 13      egészséges  115
## 14 14      egészséges  113
## 15 15      egészséges  114
## 16 16      egészséges  105
## 17 17      egészséges  115
## 18 18      egészséges  134
## 19 19      egészséges  109
## 20 20      egészséges  109
## 21 21      egészséges   93
## 22 22      egészséges  118
## 23 23      egészséges  109
## 24 24      egészséges  106
## 25 25      egészséges  125
## 26 26 magas vérnyomás  150
## 27 27 magas vérnyomás  142
## 28 28 magas vérnyomás  119
## 29 29 magas vérnyomás  127
## 30 30 magas vérnyomás  141
## 31 31 magas vérnyomás  149
## 32 32 magas vérnyomás  144
## 33 33 magas vérnyomás  142
## 34 34 magas vérnyomás  149
## 35 35 magas vérnyomás  161
## 36 36 magas vérnyomás  143
## 37 37 magas vérnyomás  140
## 38 38 magas vérnyomás  148
## 39 39 magas vérnyomás  149
## 40 40 magas vérnyomás  141
## 41 41 magas vérnyomás  146
## 42 42 magas vérnyomás  159
## 43 43 magas vérnyomás  152
## 44 44 magas vérnyomás  135
## 45 45 magas vérnyomás  134
## 46 46 magas vérnyomás  161
## 47 47 magas vérnyomás  130
## 48 48 magas vérnyomás  125
## 49 49 magas vérnyomás  141
## 50 50 magas vérnyomás  148
## 51 51 magas vérnyomás  153
## 52 52 magas vérnyomás  145
## 53 53 magas vérnyomás  137
## 54 54 magas vérnyomás  147
## 55 55 magas vérnyomás  169

A Kolmogorov–Szmirnov-próba végrehajtása. Kolmogorov–Szmirnov-próbát a ks.test() függvénnyel hajthatunk végre. Ha csoportokra szeretnénk kérni normalitás-vizsgálatot, akkor használjuk a by() függvényt. Ha a ks.test() függvényt a normalitás ellenőrzésére használjuk, akkor az x = d$mmhg minta után az elméleti eloszlásfüggvényt ("pnorm") és azok paramétereit (mean= és sd=) is meg kell adnunk.

# Kolmogorov--Szmirnov-próba a teljes mintára
ks.test(x = d$mmhg, "pnorm", mean = mean(d$mmhg), sd = sd(d$mmhg))
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  d$mmhg
## D = 0.11725, p-value = 0.4361
## alternative hypothesis: two-sided
# Kolmogorov--Szmirnov-próba az egyes csoportokra
by(d$mmhg, d$status, function(x) ks.test(x, "pnorm", mean = mean(x), sd = sd(x)))
## d$status: egészséges
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  x
## D = 0.14603, p-value = 0.6606
## alternative hypothesis: two-sided
## 
## -------------------------------------------------------- 
## d$status: magas vérnyomás
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  x
## D = 0.11729, p-value = 0.8036
## alternative hypothesis: two-sided

Alternatívák a Kolmogorov–Szmirnov-próbára. A Kolmogorov–Szmirnov-próbát módosított változata a Lilliefors-próba, amelyet a DescTools csomag LillieTest() függvényével tudjuk végrehajtani. A függvény egyetlen argumentuma a minta.

library(DescTools)
LillieTest(x = d$mmhg)                            # Lilliefors-próba a teljes mintára
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  d$mmhg
## D = 0.11725, p-value = 0.05723
by(d$mmhg, d$status, LillieTest)                  # Lilliefors-próba az egyes csoportokra
## d$status: egészséges
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  dd[x, ]
## D = 0.14603, p-value = 0.1837
## 
## -------------------------------------------------------- 
## d$status: magas vérnyomás
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  dd[x, ]
## D = 0.11729, p-value = 0.3645