Comment simuler une analyse de puissance personnalisée d'un modèle lm (à l'aide de R)

13

Suite aux récentes questions que nous avions ici .

Je sautais pour savoir si quelqu'un était tombé sur ou pouvait partager du code R pour effectuer une analyse de puissance personnalisée basée sur la simulation d'un modèle linéaire?

Plus tard, je voudrais évidemment l'étendre à des modèles plus complexes, mais lm semble être le bon endroit pour commencer. Merci.

Tal Galili
la source

Réponses:

4

Je ne suis pas sûr que vous ayez besoin d'une simulation pour un modèle de régression simple. Par exemple, consultez le document Portable Power . Pour les modèles plus complexes, en particulier les effets mixtes, le package pamm dans R effectue des analyses de puissance via des simulations. Voir également le post de Todd Jobe qui a un code R pour la simulation.

ars
la source
1
Le lien d'alimentation portable est rompu. Si quelqu'un peut mettre à jour le lien, ce serait bien. THX.
Brian P
3

Voici quelques sources de code de simulation dans R. Je ne sais pas s'il en existe spécifiquement sur les modèles linéaires, mais ils fournissent peut-être suffisamment d'exemples pour obtenir l'essentiel:

Il existe deux autres exemples de simulation sur les sites suivants:

Jeromy Anglim
la source
0

Adapté de Bolker 2009 Ecological Models and Data in R. Vous devez déclarer la force de la tendance (c'est-à-dire la pente) que vous souhaitez tester. Intuitivement, une tendance forte et une faible variabilité nécessiteront une petite taille d'échantillon, une tendance faible et une grande variabilité nécessiteront une grande taille d'échantillon.

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

Vous pouvez également simuler la tendance minimale que vous pourriez tester pour une taille d'échantillon donnée, comme indiqué dans le livre

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)
À M
la source