Чому тести гіпотез щодо повторно впорядкованих наборів даних занадто часто відкидають нуль?


10

tl; dr: Починаючи з набору даних, згенерованого під нуль, я перекомпонував випадки із заміною та провів перевірку гіпотез на кожному перекомпонованому наборі даних. Ці тести гіпотези відкидають нуль більше 5% часу.

нижче, дуже просте моделювання, я набори даних за допомогою , і я підходжу просту модель OLS до кожного. Потім для кожного набору даних я генерую 1000 нових наборів даних шляхом перекомпонування рядків оригінального набору даних із заміною (алгоритм, специфічно описаний у класичному тексті Девісона та Хінклі як відповідний для лінійної регресії). Для кожного з них мені підходить однакова модель OLS. Зрештою, близько 16% тестів гіпотез у зразках завантажувальної програми відкидають нуль , тоді як нам слід отримати 5% (як це робиться в оригінальних наборах даних).ХN(0,1)⨿YN(0,1)

Я підозрював, що це пов'язане з неодноразовими спостереженнями, що викликають завищені асоціації, тому для порівняння я спробував два інших підходи в наведеному нижче коді (прокоментував). У Способі 2 я виправляю , а потім замінюю на перекомпоновані залишки з моделі OLS на початковому наборі даних. У Способі 3 я малюю випадкову підпробову схему без заміни. Обидві ці альтернативи працюють, тобто їхні тести на гіпотезу відкидають нульові 5% часу.YХY

Моє запитання: чи я правий, що винуватець неодноразових спостережень? Якщо так, враховуючи, що це стандартний підхід до завантажувального завантаження, де саме ми порушуємо стандартну теорію завантаження?

Оновлення №1: Більше моделювання

Я спробував ще більш простий сценарій, перехоплення тільки регресійну модель для . Зустрічається та ж проблема.Y

# note: simulation takes 5-10 min on my laptop; can reduce boot.reps
#  and n.sims.run if wanted
# set the number of cores: can change this to match your machine
library(doParallel)
registerDoParallel(cores=8)
boot.reps = 1000
n.sims.run = 1000

for ( j in 1:n.sims.run ) {

  # make initial dataset from which to bootstrap
  # generate under null
  d = data.frame( X1 = rnorm( n = 1000 ), Y1 = rnorm( n = 1000 ) )

  # fit OLS to original data
  mod.orig = lm( Y1 ~ X1, data = d )
  bhat = coef( mod.orig )[["X1"]]
  se = coef(summary(mod.orig))["X1",2]
  rej = coef(summary(mod.orig))["X1",4] < 0.05

  # run all bootstrap iterates
  parallel.time = system.time( {
    r = foreach( icount( boot.reps ), .combine=rbind ) %dopar% {

      # Algorithm 6.2: Resample entire cases - FAILS
      # residuals of this model are repeated, so not normal?
      ids = sample( 1:nrow(d), replace=TRUE )
      b = d[ ids, ]

      # # Method 2: Resample just the residuals themselves - WORKS
      # b = data.frame( X1 = d$X1, Y1 = sample(mod.orig$residuals, replace = TRUE) )

      # # Method 3: Subsampling without replacement - WORKS
      # ids = sample( 1:nrow(d), size = 500, replace=FALSE )
      # b = d[ ids, ]

      # save stats from bootstrap sample
      mod = lm( Y1 ~ X1, data = b ) 
      data.frame( bhat = coef( mod )[["X1"]],
                  se = coef(summary(mod))["X1",2],
                  rej = coef(summary(mod))["X1",4] < 0.05 )

    }
  } )[3]


  ###### Results for This Simulation Rep #####
  r = data.frame(r)
  names(r) = c( "bhat.bt", "se.bt", "rej.bt" )

  # return results of each bootstrap iterate
  new.rows = data.frame( bt.iterate = 1:boot.reps,
                         bhat.bt = r$bhat.bt,
                         se.bt = r$se.bt,
                         rej.bt = r$rej.bt )
  # along with results from original sample
  new.rows$bhat = bhat
  new.rows$se = se
  new.rows$rej = rej

  # add row to output file
  if ( j == 1 ) res = new.rows
  else res = rbind( res, new.rows )
  # res should have boot.reps rows per "j" in the for-loop

  # simulation rep counter
  d$sim.rep = j

}  # end loop over j simulation reps



##### Analyze results #####

# dataset with only one row per simulation
s = res[ res$bt.iterate == 1, ]

# prob of rejecting within each resample
# should be 0.05
mean(res$rej.bt); mean(s$rej)

Оновлення №2: Відповідь

У коментарях та відповідях було запропоновано кілька можливостей, і я зробив більше моделювання, щоб їх емпірично перевірити. Виявляється, JWalker вірно в тому, що проблема полягає в тому, що нам потрібно було центрувати статистику завантажувальної програми за оцінкою оригінальних даних, щоб отримати правильний розподіл вибірки під . Однак я також вважаю, що коментар Ваубера про порушення припущень параметричного тесту також є правильним, хоча в цьому випадку ми дійсно отримуємо номінальні помилкові позитиви, коли ми вирішуємо проблему JWalker.Н0


1
У стандартній завантажувальній програмі ви б розглядали лише розподіл завантажувального коефіцієнта завантажувального коефіцієнта X1, а не пов'язані з ним значення p. Таким чином, це не проблема завантажувальної програми. Тим не менш, ваше спостереження цікаве та неінтуїтивне.
Майкл М

1
@MichaelM, це правда. Але оскільки спільний CDF даних у повторних примірниках повинен збігатися в n, а кількість завантажувальних ітерацій перетворюється на справжній CDF, який генерував вихідні дані, я не очікував, що значення p також відрізнятимуться.
півзахист

Правильно. Я впевнений, що ефект спостерігається від того, що спостереження є незалежними (як ви вже говорили), що призводять до занадто оптимістичних стандартних помилок. У вашому моделюванні, здається, це єдине порушене припущення про звичайну лінійну модель. Можливо, ми навіть можемо отримати відповідний коефіцієнт дефляції дисперсії.
Майкл М

2
хidsids <- unique(ids)

2
@whuber. Розумію. І це пояснило б, чому перекомпонування залишків із заміною працює, незважаючи на неодноразові спостереження: залишки цієї моделі знову не залежать від X. Якщо ви хочете зробити це у відповідь, я би радий прийняти.
півзахист

Відповіді:


5

При повторному впорядкуванні нуля очікуване значення коефіцієнта регресії дорівнює нулю. Під час повторної вибірки деякого спостережуваного набору даних очікуване значення - це спостережуваний коефіцієнт для цих даних. Це не помилка I типу, якщо P <= 0,05 при повторному впорядкуванні спостережуваних даних. Насправді це помилка II типу, якщо у вас P> 0,05.

Ви можете отримати деяку інтуїцію, обчисливши кореляцію між абс (b) і середнім (P). Ось простіший код для повторення того, що ви зробили, плюс обчислення кореляції між b і помилкою "типу I" над набором симуляцій

boot.reps = 1000
n.sims.run = 10
n <- 1000
b <- matrix(NA, nrow=boot.reps, ncol=n.sims.run)
p <- matrix(NA, nrow=boot.reps, ncol=n.sims.run)
for(sim_j in 1:n.sims.run){
  x <- rnorm(n)
  y <- rnorm(n)
  inc <- 1:n
  for(boot_i in 1:boot.reps){
    fit <- lm(y[inc] ~ x[inc])
    b[boot_i, sim_j] <- abs(coefficients(summary(fit))['x[inc]', 'Estimate'])
    p[boot_i, sim_j] <- coefficients(summary(fit))['x[inc]', 'Pr(>|t|)']
    inc <- sample(1:n, replace=TRUE)
  }
}
# note this is not really a type I error but whatever
type1 <- apply(p, 2, function(x) sum(x <= 0.05))/boot.reps
# correlation between b and "type I"
cor(b[1, ], type1)

оновлення відповіді grand_chat не є причиною частоти P <= 0,05> 0,05. Відповідь дуже проста, і те, що я вже говорив вище, - очікуване значення середнього значення для кожного повторного зразка є початковим, спостережуваним середнім. Це вся основа завантажувальної програми, яка була розроблена для створення стандартних меж помилок / довіри на спостережуваному середньому рівні, а не як тест на гіпотезу. Оскільки очікування не дорівнює нулю, звичайно помилка "типу I" буде більшою, ніж альфа. І тому виникне кореляція між величиною коефіцієнта (наскільки далеко від нуля) та величиною відхилення «помилки I типу» від альфа.


Н0:β=β^Н0:β=0

Н0:β=βˆН0:β=0Н0:β=0на дослідженні на ранній стадії для відфільтрування грибів, коли ви не знаєте достатньо, щоб визначити альтернативну гіпотезу, тоді, коли відомо більше, можливо, має сенс перейти на перевірку правильності своїх знань.
ReneBt

2

Якщо ви пробите з заміною з початкового звичайного зразка, отриманий зразок завантажувального пристрою не є нормальним . Спільний розподіл зразка завантажувального пристрою слідує за загальним розподілом суміші, який, ймовірно, містить дублікати записів, тоді як значення дублікатів мають нульову ймовірність, коли ви берете iid-зразки з звичайного розподілу.

Як простий приклад, якщо ваш оригінальний зразок - це два спостереження від одномірного нормального розподілу, то зразок завантажувальної програми з заміною вдвічі буде складатися з вихідного зразка, а половина часу буде складатися з одного з вихідних значень, дублюваних. Зрозуміло, що дисперсія зразка завантажувального зразка в середньому буде меншою, ніж у оригіналу - адже вона буде наполовину оригінальною.

pт


Але якщо це так, то чи не виникне у нас точно така ж проблема при перекомпонуванні залишків із заміною? Однак насправді такий підхід відкидається з номінальною ймовірністю.
половина минути

Також t-тест з n = 1000 не повинен мати проблем з ненормальними даними.
півзахист

0

Я повністю згоден з відповіддю @ JWalker.

Є ще один аспект цієї проблеми. Це у вашому процесі перекомпонування. Ви очікуєте , що коефіцієнт регресії буде зосереджений навколо нуля , тому що ви берете на себе Xі Yнезалежні. Однак у своєму перекомпонуванні ви це робите

ids = sample( 1:nrow(d), replace=TRUE )
  b = d[ ids, ]

що створює кореляцію, тому що ви займаєтеся вибіркою Xта Yразом. Наприклад, скажімо , перший рядок набору даних dє (x1, y1), в наборі даних передіскретізіруется, P(Y = y1|X = x1) = 1, в той час як , якщо Xі Yнезалежні, P(Y|X = x1)слід нормальному розподілу.

Отже, ще один спосіб виправити це - використовувати

b = data.frame( X1 = rnorm( n = 1000 ), Y1 = rnorm( n = 1000 ) )

той самий код, який ви використовуєте для створення d, щоб зробити X і Y незалежними один від одного.

Ця ж причина пояснює, чому вона працює із залишковим перекомпонуванням (оскільки Xце не залежить від нового Y).


Деякий час я також думав, що спостережувані повторні спостереження можуть бути незалежними, але, думаючи про це набагато більше, я насправді не думаю, що це так: stats.stackexchange.com/questions/339237/…
половина -захід

Проблема, яку я описав вище, відрізняється від вашої публікації. Те, про що ви згадували, - це незалежність x's. Те, про що я згадував, - це співвідношення між Xs та Ys.
Tianxia Zhou

-1

Найбільшою проблемою тут є те, що результати моделі є хибними та, отже, дуже нестабільними, оскільки модель просто чує шум. У дуже буквальному сенсі. Y1 не є залежною змінною через те, як створювались вибіркові дані.


Редагуйте, відповідаючи на коментарі. Дозвольте ще раз спробувати пояснити своє мислення.

За допомогою OLS загальний намір полягає у виявленні та кількісній оцінці базових співвідношень у даних. З реальними даними ми зазвичай їх точно не знаємо.

Але це штучна тестова ситуація. Ми знаємо ТОЧНИЙ механізм генерації даних, саме там, у коді, розміщеному ОП

X1 = rnorm (n = 1000), Y1 = rnorm (n = 1000)

Якщо висловити це у звичній формі регресії OLS, тобто

Y1 = перехоплення + Beta1 * X1 + помилка,
яка стає
Y1 = середня (X1) + 0 (X1) + помилка

Отже, на мій погляд, це модель, виражена в лінійній ФОРМІ, але це НЕ насправді лінійна залежність / модель, тому що немає нахилу. Бета1 = 0,000000.

Коли ми генеруємо 1000 випадкових точок даних, розсіювач буде виглядати як класичний круговий пульверизатор. У конкретній вибірці з 1000 випадкових точок, яка була сформована, може бути деяка кореляція між X1 та Y1, але якщо так, то це випадкові випадки. Якщо OLS виявляє кореляцію, тобто відкидає нульову гіпотезу про відсутність нахилу, оскільки ми остаточно знаємо, що між цими двома змінними насправді не існує жодної залежності, тоді OLS буквально знайшов схему в компоненті помилок. Я охарактеризував це як "підходить до шуму" і "неправдивий".

Крім того, одним із припущень / вимог STD для OLS є те, що (+/-) "модель лінійної регресії є" лінійною за параметрами ". З огляду на дані, я вважаю, що ми не задовольняємо це припущення. Отже, наведені статистичні дані тестування щодо значущості є неточними. Я вважаю, що порушення припущення про лінійність є прямою причиною неінтуїтивних результатів завантажувальної програми.

Коли я вперше прочитав цю проблему, вона не занурилася в те, що ОП має намір протестувати під нульовою [гіпотезою].

Але чи траплялися б ті ж неінтуїтивні результати, як би створювався набір даних як

X1 = rnorm (n = 1000), Y1 = X1 * .4 + rnorm (n = 1000)?


4
Y1Y1

(-1) з тих же причин @whuber дав.
половина проходу

1
Відповідь на остаточне запитання у вашій редакції: так, безумовно. Спробуйте самостійно за допомогою симуляції. (Але будьте уважні до тлумачення, тому що ви повинні врахувати, що таке нуль і який справжній стан справ.)
whuber
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.