Как смоделировать пользовательский анализ мощности модели lm (используя R)

13

Следуя недавним вопросам, которые у нас были здесь .

Я прыгал, чтобы узнать, сталкивался ли кто-нибудь или может поделиться кодом R для выполнения пользовательского анализа мощности, основанного на моделировании для линейной модели?

Позже я, очевидно, хотел бы расширить его на более сложные модели, но мне кажется, что мне стоит начать с него. Благодарю.

Таль Галили
источник

Ответы:

4

Я не уверен, что вам нужна симуляция для простой регрессионной модели. Например, см. Статью Portable Power . Для более сложных моделей, в частности смешанных эффектов, пакет pamm в R выполняет анализ мощности посредством моделирования. Также см. Пост Тодда Джоба, в котором есть R-код для симуляции.

АРС
источник
1
Связь с портативным устройством не работает. Если кто-то может обновить ссылку, это было бы здорово. Спасибо.
Брайан П
3

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

  • Бенджамин Болкер написал большую книгу « Экологические данные и модели с R» . Предварительный набросок всей книги вместе с кодом Sweave доступен онлайн. Глава 5 посвящена анализу и моделированию мощности.

Есть еще пара примеров симуляции на следующих сайтах:

Джером англим
источник
0

Адаптировано из Bolker 2009 Экологические модели и данные в R. Вам необходимо объявить силу тренда (то есть наклон), который вы хотите протестировать. Интуитивно понятно, что сильная тенденция и низкая изменчивость потребуют небольшого размера выборки, слабая тенденция и большая изменчивость потребуют большого размера выборки.

a = 2  #desired slope
b = 1  #estimated intercept
sd = 20  #estimated variability defined by standard deviation
nsim = 400  #400 simulations
pval = numeric(nsim)  #placeholder for the second for loop output
Nvec = seq(25, 100, by = 1)  #vector for the range of sample sizes to be tested
power.N = numeric(length(Nvec))   #create placeholder for first for loop output
for (j in 1:length(Nvec)) {
  N = Nvec[j]  
  x = seq(1, 20, length = Nvec[j])  #x value length needs to match sample size (Nvec) length
  for (i in 1:nsim) {   #for this value of N, create random error 400 times
    y_det = a + b * x
    y = rnorm(N, mean = y_det, sd = sd)
    m = lm(y ~ x)
    pval[i] = coef(summary(m))["x", "Pr(>|t|)"]  #all the p values for 400 sims
  }  #cycle through all N values
  power.N[j] = sum(pval < 0.05)/nsim  #the proportion of correct p-values (i.e the power)
}
power.N
plot(Nvec, power.N)  #need about 90 - 100 samples for 80% power

Вы также можете смоделировать минимальный тренд, который вы можете протестировать для данного размера выборки, как показано в книге.

bvec = seq(-2, 2, by = 0.1)
power.b = numeric(length(bvec))
for (j in 1:length(bvec)) {
  b = bvec[j]
   for (i in 1:nsim) {
     y_det = a + b * x
     y = rnorm(N, mean = y_det, sd = sd)
     m = lm(y ~ x)
     pval[i] = coef(summary(m))["x", "Pr(>|t|)"]
     }
   power.b[j] = sum(pval < 0.05)/nsim
  }
 power.b
 plot(bvec, power.b)
Том
источник