2017-01-17 2 views
2

J'ai une étude de simulation que je souhaiterais éventuellement tracer les résultats de l'utilisation de ggplot2. Cependant, cela nécessite que les données soient en format long, ce que je trouve pas très pratique quand on fait une étude de simulation qui utilise naturellement une sorte de plan factoriel. Ma question concerne comment aborder cela.Stockage de données en format long ou tableau en simulation

Voici un exemple factice pour illustrer tout cela. Supposons que nous voulions comparer l'estimateur MCO de la pente dans une régression linéaire simple avec et sans interception incluse pour deux tailles d'échantillon pour les réplications R. Nous pouvons stocker cela en utilisant:

  • un tableau R x 2 x 2 (replications x estimators x sample sizes)
  • un cadre de données (Tibble) avec des variables Replication, Sample size, Estimator et Value

Voici le tableau et trame de données en R :

library(tidyverse) 
# Settings 
R <- 10 
est <- c("OLS1", "OLS2") 
n <- c(50, 100) 

# Initialize array 
res <- array(NA, 
      dim = c(R, length(est), length(n)), 
      dimnames = list(Replication = 1:R, 
          Estimator = est, 
          Sample_size = n)) 

tibb <- as_tibble(expand.grid(Replication = 1:R, Sample_size = n, Estimator = est)) %>% 
    mutate(Value = NA) 

Pour remplir ces valeurs, voici le corps principal de la simulation:

for (i in seq_along(n)) { 
    nn <- n[i] 
    x <- rnorm(nn) 
    for (j in 1:R) { 
    y <- 1 * x + rnorm(nn) 
    mod1 <- lm(y ~ 0 + x) 
    mod2 <- lm(y ~ 1 + x) 
    res[j, 1, i] <- mod1$coefficients[1] 
    res[j, 2, i] <- mod2$coefficients[2] 

    tibb[tibb$Replication == j & tibb$Sample_size == nn & tibb$Estimator == "OLS1", "Value"] <- mod1$coefficients[1] 
    tibb[tibb$Replication == j & tibb$Sample_size == nn & tibb$Estimator == "OLS2", "Value"] <- mod2$coefficients[2] 
    } 
} 

Maintenant, tibb est immédiatement prêt à comploter avec ggplot2. Cependant, cette sélection de ligne qui est en cours est assez gênante. D'autre part, tout en remplissant le tableau se sent naturel et intuitif, il faut plus de travail pour être transformé dans le format approprié pour le traçage.

Alors, comment dois-je mieux aborder cela? (En gardant à l'esprit que de vraies simulations auraient généralement plus de dimensions que ce que j'ai utilisé ici.) Y a-t-il d'autres meilleures façons de faire cela?

Répondre

1

D'abord, je vous suggère de lire le bon blog sur tidy data

En gardant à l'esprit que

  • Chaque colonne est une variable.
  • Chaque ligne est une observation.

Vous pouvez créer un datafram contenant toutes les simulations planifiées. Définissez votre simulation en tant que fonction et appliquez cette fonction à chaque ligne de la trame:

library(dplyr) 
library(ggplot2) 

# pre-define your simulations 
df = expand.grid(Replication=1:10, Sample_size=c(50,100), Estimator=c("OLS1", "OLS2")) 

# your simulation in a function 
sim <- function(n, est) { 
    x = rnorm(n) 
    y = 1 * x + rnorm(n) 
    ic = rep(ifelse(est=="OLS1",0,1), n) 
    lm(y ~ ic + x)$coefficients["x"] 
} 

# simulate and plot 
df %>% 
    rowwise() %>% 
    mutate(coefs= sim(Sample_size, Estimator)) %>% 
    ggplot(aes(x=Replication, y=coefs, colour=as.factor(Sample_size), shape=Estimator)) + 
    geom_point() 
+0

Merci, la solution 'rowwise()' est une très bonne idée. Je connais bien les données et j'utilise fréquemment son paradigme lorsque je travaille avec des données réelles, mais cela ne me semble pas idéal pour les études de simulation (et en particulier le remplissage de bases de données vides pré-allouées). – hejseb