функция all.moments странный результат - PullRequest
2 голосов
/ 22 марта 2012

Я хочу рассчитать n-й момент раздачи.Я пытаюсь использовать функцию all.moments библиотеки 'моменты' в R. Я протестировал all.moments таким образом:

 library(moments)
 r<-rnorm(10000)
 rr<-all.moments(r,order.max=4)
 rr

 [1]  1.000000000  0.002403360  0.962201478 -0.022694670  2.852696159

Мне кажется, что это не так, потому что я знаю, что3-й и 4-й моменты должны быть 0 при нормальном распределении.Где моя ошибка?

Ответы [ 3 ]

6 голосов
/ 22 марта 2012

Третий момент - это асимметрия .Вы правы: для нормального распределения это ноль.Поскольку вы производите выборку только из нормального распределения, ваши результаты будут приблизительно равны нулю.

Четвертый момент порядка - kurtosis .Для нормального распределения это 3σ ^ 4.В этом случае σ равно 1, поэтому ваш результат должен быть равен 3.


Чтобы повысить точность вашей оценки, увеличьте размер выборки.Для выборки из 1e7 наблюдений:

> library(moments)
> r <- rnorm(1e7)
> all.moments(r,order.max=4)
[1] 1.0000000000 0.0004028138 0.9995373115 0.0007276404 2.9976881271
1 голос
/ 22 марта 2012

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

(См. Также ответ @ Андри, почему четвертый момент (V5 ниже) даже неблизко к нулю.)

> library(moments)
> R <- t(replicate(50,all.moments(rnorm(1e4),order.max=4)))
> summary(R)
       V1          V2                  V3               V4            
 Min.   :1   Min.   :-0.024921   Min.   :0.9714   Min.   :-0.0987174  
 1st Qu.:1   1st Qu.:-0.009527   1st Qu.:0.9911   1st Qu.:-0.0341950  
 Median :1   Median : 0.001021   Median :0.9994   Median : 0.0067138  
 Mean   :1   Mean   :-0.001047   Mean   :1.0006   Mean   :-0.0002613  
 3rd Qu.:1   3rd Qu.: 0.004711   3rd Qu.:1.0147   3rd Qu.: 0.0299731  
 Max.   :1   Max.   : 0.023356   Max.   :1.0398   Max.   : 0.1283456  
       V5       
 Min.   :2.775  
 1st Qu.:2.921  
 Median :3.005  
 Mean   :3.007  
 3rd Qu.:3.092  
 Max.   :3.325  
0 голосов
/ 23 ноября 2012

Я получил ту же проблему, работая в Python, и я думаю, что ограниченная точность арифметики с плавающей точкой на компьютере, особенно. с полномочиями большого числа, также не помогает. Я буду вырезать и вставить свой код Python и результаты, которые я получу. Этот код пытается вычислить первые 20 моментов стандартной нормали. Короче говоря, я думаю, что не легко вычислить числовые моменты высокого порядка, «высокий порядок» означает здесь больше 10 или около того. В отдельном эксперименте я пытался уменьшить дисперсию, которую я получаю в 18-й момент, рисуя все больше и больше образцов, но это было непрактично, учитывая мой «обычный» компьютер.

N = 1000000
w = np.random.normal(size=N).astype("float128")

for i in range(20):
    print i, mean(w**i) # simply computing the mean of the data to the power of i

Дает вам:

0 1.0
1 0.000342014729693
2 1.00124397377
3 0.000140133725668
4 3.00334304532
5 0.00506625342217
6 15.0227401941
7 0.0238395446636
8 105.310071549
9 -0.803915389936
10 948.126995798
11 -34.8374820713
12 10370.6527554
13 -1013.23231638
14 132288.117911
15 -26403.9090218
16 1905267.02257
17 -658590.680295
18 30190439.4783
19 -16101299.7354

Но правильные моменты: 1, 0, 1, 0, 3, 0, 15, 0, 105, 0, 945, 0, 10395, 0, 135135, 0, 2027025, 0, 34459425, 0, 654729075 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...