Как стать автором
Обновить

Комментарии 23

Это тот редкий случай, когда обосновать законность применения метода сложнее, чем применить сам метод. И его самый важный недостаток, как и у всех методов Монте-Карло, точность растет медленнее, чем количество наблюдений.
То же самое можно сказать про классические параметрические методы. Я ни разу не видел в настоящих данных нормальное распределение, поэтому строго говоря всякие t-тесты и p-значения от них неприменимы (что мало кому мешает их использовать на практике). Точность у параметрических методов тоже растёт медленнее, чем количество наблюдений.

Другое дело что если предположения, лежащие в основе параметрических методов, выполняются, тогда их результат в некотором смысле оптимален. Про Монте-Карло такое сказать нельзя, по крайней мере при конечном количестве итераций. А при бесконечном количестве итераций получается сферический конь в вакууме.
1. Причиной того, что Вы не видели в настоящих данных нормального распределения может быть то, что Вы ожидаете теоретическое нормальное распределение (вместо емпирического). Посмотрите на гистограммы выборок, полученных генератором случайных нормально распределенных чисел при разных размерах выборок. Вы должны сравнивать именно с такими гистограммами, а не с теоретической кривой. При малых размерах выборки гистограммы нормального распределения достаточно сильно отличаются.
2. Не согласен что параметрические тесты неприменимы: при умеренных отклонениях от нормального распределения они всегда дают правильный ответ. Но согласен, что их часто используют в ситуациях когда они становятся ошибочны.
3. Понятия точности для статистического теста не определено. Есть понятие мощности теста. Мощность — вероятность, что тест отклонит нулевую гипотезу, если она на самом деле не верна. Мощность параметрических тестов гораздо выше чем непараметрических и возрастает (в приближении) пропорционально квадрату количества наблюдений.
4. Число возможных сочетаний с повторениями конечно. При использовании в бутстрапе всех таких сочетаний результат оптимален. Конечно, в примере, данном в статье, число сочетаний с повторениями слишком огромно, но при малых размерах выборки вполне достижимо.
Извиняюсь, в пункте 3 должно быть "… пропорционально квадратному корню с количества наблюдений"
1. Нет, дело не в шуме из-за размера выборки (у меня они большие), дело именно в кривизне распределений. Как в правиле 20/80, по которому 20% людей выпивают 80% пива. Некоторые распределения можно приблизить логнормальным (количество денег в банке) или всякой экзотикой вроде распределения Васичека (потери), но нет гарантии, что это правильно отражает суть того, что на самом деле происходит. Даже такие вроде бы нормальные величины как вес или рост не следуют нормальному распределению, вопрос только в том, какой должен быть размер выборки, чтобы это понять.

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

3. Мощность параметрических тестов гораздо выше, но они опираются на предположения, которые не обязательно выполняются. При больших размерах выборки (10^5 и больше) t-тест почти всегда находит статистически значимую разницу между тестовой и контрольной группой в A/A тесте, просто потому что они выбраны хоть немного неслучайно.
Поддерживаю и согласен со всем. 1. В разных сферах — разная природа данных. Их природа и определяет форму распределения. Но следует учитывать, что в статистических тестах нормальным должно быть распределение остатков, а не исходной выборки (хоть они и связаны). У меня при анализе медицинских данных около 30% случаев имеют распределение остатков достаточно близкое к нормальному.
3. Поэтому размер эффекта более важен нежели р-величины.
Хм, я вот регулярно сталкиваюсь с нормальным распределением в настоящих данных (психологические измерения), но тут всё зависит от того, как мы определяем нормальность. Критерии Шапиро-Уилкса, Колмогорова-Смирнова и «я на глазок прикинул, мамой клянусь — гауссиана» — дают порой довольно разные результаты, тем более если размеры выборок невелики.

Когда я преподавал матметоды я обычно просил студентов проверить нормальность равномерного распределения из 30 случаев (на 10, кажется, интервалах). Ну так вот, нет оснований считать, что такая выборка извлечена из совокупности с ненормальным распределением — если мы пользуемся формальным критерием.

Энное количество статей математиками написано на тему робастности статистических критериев к разным отклонениям от исходных допущений…
На маленьких выборках действительно понять, нормальное распределение или нет, сложно. Но у меня большие выборки (десятки тысяч, даже миллионы наблюдений). Тесты на нормальность при таких размерах заявляют, что ни одной гауссианы они не видят.

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

Или то же потребление пива. Много людей не пьют вообще, у пьющих есть горб где-то посередине, а потом — длинный тонкий хвост. Опять ненормальное распределение. Можно нули отдельно моделировать, а пьющих преобразовать, но как именно? Предположения какие-то надо делать по поводу формы хвоста, от них результат зависеть будет.

Одна из особенностей бутстрапа как раз в том, что он не требует делать такие предположения.
Действительно, тесты на нормальность при малых размерах выборки не смогут отбросить гипотезу о нормальном распределении даже если ним там и не пахнет, а при больших размерах даже при пустяковых отклонениях дадут р<0,05. Поэтому их использование справедливо только для небольшого интервала размеров (где то посередине). Так вот, на глаз — а именно инспекция квантиль-квантильного нормального графика — как раз самое то. А нули при измерении давления — это выбросы, от них нужно избавлятся.
Избавляться от выбросов чревато. Недавно вот финансовый кризис был, не в последнюю очередь потому, что финансовые моделисты наделали предположений о форме распределений и избавились от выбросов. Нассим Талеб про это хорошо пишет.

Одно дело если я метеорологией занимаюсь, тогда спокойно могу нули выкинуть. Если атмосферное давление действительно равно нулю, то мои исследования никому уже не нужны.

А если я инженер, который датчик давления делает, для меня эти выбросы — весьма важные данные.
Тут проблема-то в том, что если мы в принципе оцениваем «среднее», хоть бутстрапом, хоть как угодно, мы используем этот параметр для оценки данных, а вот осмысленность его использования — зависит от распределения. Поэтому всё равно, чтобы сравнивать две выборки по какому-то такому вот параметру, нужно, чтобы их распределения относились к _одному типу_. Не обязательно — нормальному.

Про пьющих пиво — это распределение Парето. Меня вообще очень интересует вопрос применимости различных статистических техник к этому распределению, так как я занимаюсь вещами на грани с лингвистикой, где это распределение является куда более естественным, чем нормальное (см. закон Ципфа).
Согласен. А для регрессии с Парето-распределенной зависимой переменной можно использовать достаточно универсальный инструмент — GAMLSS (имплементирован на R и Java).
Берем на вооружение!
В астрономии мы опыты повторять не можем, а статистику навести хочется, потому пользуем бутстрап.
В C нет bool, данные будем хранить в int.

Не принципиально, но вообще-то в C есть тип bool, начиная с C99.
Благодаря КДПВ узнал, что bootstrap означает «шнурок», как-то раньше в голову не приходило. Спасибо!
bootstrap — это не шнурок, а петля на задней стороне ботинок.
Да, действительно. Не разобрался.
В данном контексте — вытягивание себя из болота за шнурки, по примеру барона Мюнхаузена.
По поводу реализации: стандартный библиотечный rand() может иметь весьма короткий период повторения последовательности: в лучшем случае около 10^9, а в худшем — 32767! Для любых реализаций методов Монте-Карло рекомендуется использовать известные алгоритмы генерации псевдослучайных чисел, такие как Mersenne-Twister.
В примере rand() вызывается около 2*10^7 раз. У стандартного библиотечного rand() из glibc период повторения последовательности 2*10^9. Там вроде сдвиговый регистр с обратной связью используется, отсюда и цикл длиной 2^31.

То есть в это ограничение мы пока не упёрлись, но на настоящих данных если размер выборки окажется кратен длине цикла, то действительно можно попасть.
В MS CRT период 32767.
В качестве тренировки реализовал то же самое на Haskell:

-- bootstrap.hs
module Main where

import Data.List
import Control.Monad
import Control.Monad.Trans.State
import System.Environment
import System.Random
import Text.Printf

randomsN :: (RandomGen g, Random a) => (g -> (a, g)) -> Int -> g -> ([a], g)
randomsN rnd n = runState (replicateM n (state rnd))

bootstrap :: (RandomGen g) => (Int, Int) -> g -> (Double, g)
bootstrap (sN, tN) gen =
	(successCount / realToFrac tN, newGen)
	where 
		rnd = randomR (1, tN)
		(rs, newGen) = randomsN rnd tN gen
		successCount = genericLength $ filter (<=sN) rs
	
minusMetric :: RandomGen g => (Int, Int) -> (Int, Int) -> g -> (Double, g)
minusMetric test control g =
	(m1 - m2, g2)
	where
		(m1,g1) = bootstrap test g
		(m2,g2) = bootstrap control g1

createGen :: [String] -> IO StdGen
createGen [] = getStdGen
createGen [seed]= return $ mkStdGen $ read seed

main :: IO ()
main = do
	gen <- getArgs >>= createGen
	let 
		metric = minusMetric (34, 893) (28, 923)
		(ms,_) = randomsN metric 10000 gen
		os = sort ms
		lcl = (os !! 250) * 100
		ucl = (os !! 9750) * 100
	putStrLn $ printf "LCL=%g%%" lcl
	putStrLn $ printf "UCL=%g%%" ucl


Компилируем:
$ ghc --make -O2 bootstrap.hs


Запускаем:
$ ./bootstrap.exe
LCL=-0.8913676736965855%
UCL=2.4389770442796324%

$ ./bootstrap.exe 42
LCL=-0.8840882316900799%
UCL=2.5182016381170995%

$ ./bootstrap.exe 2013
LCL=-0.8768087896835746%
UCL=2.4535359282926428%

$ ./bootstrap.exe 2013
LCL=-0.8768087896835746%
UCL=2.4535359282926428%
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории