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
etValue
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?
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