studio - superponer graficas en r
Pensando en vectores con R (2)
Claramente, debería haber trabajado en esto por una hora más antes de publicar mi pregunta. Es tan obvio en retrospectiva. :)
Para usar la lógica vectorial de R saqué el lazo y lo reemplacé con esto:
st <- sample(c(12,17,24),10000,prob=c(20,30,50),replace=TRUE)
p1 <- sample(c(12,17,24),10000,prob=c(20,30,50),replace=TRUE)
p2 <- sample(c(12,17,24),10000,prob=c(20,30,50),replace=TRUE)
year <- rep(1991:2000,1000)
Ahora puedo hacer 100,000 muestras casi instantáneas. Sabía que los vectores eran más rápidos, pero maldita sea. Supongo que 100.000 bucles habrían tomado más de una hora usando un bucle y el enfoque vectorial tomaría <1 segundo. Solo por las patadas hice millones de vectores. Tardó ~ 2 segundos en completarse. Como debo probar el error, probé 10 mm pero me quedé sin memoria en mi laptop de 2GB. Cambié a mi computadora de escritorio Vista 64 con 6 GB de ram y creé vectores de 10 mm de longitud en 17 segundos. 100 mm hicieron que las cosas se desmoronaran ya que uno de los vectores superaba los 763mb, lo que resultó en un problema de asignación con R.
Los vectores en R son increíblemente rápidos para mí. Supongo que es por eso que soy un economista y no un científico de la computación.
Sé que R funciona de manera más eficiente con vectores y se debe evitar el bucle. Estoy teniendo dificultades para enseñarme a escribir código de esta manera. Me gustaría algunas ideas sobre cómo ''vectorizar'' mi código. Aquí hay un ejemplo de cómo crear 10 años de datos de muestra para 10,000 combinaciones no únicas de estado ( st
), plan1 ( p1
) y plan2 ( p2
):
st<-NULL
p1<-NULL
p2<-NULL
year<-NULL
i<-0
starttime <- Sys.time()
while (i<10000) {
for (years in seq(1991,2000)) {
st<-c(st,sample(c(12,17,24),1,prob=c(20,30,50)))
p1<-c(p1,sample(c(12,17,24),1,prob=c(20,30,50)))
p2<-c(p2,sample(c(12,17,24),1,prob=c(20,30,50)))
year <-c(year,years)
}
i<-i+1
}
Sys.time() - starttime
Esto demora aproximadamente 8 minutos en ejecutarse en mi computadora portátil. Termino con 4 vectores, cada uno con 100.000 valores, como se esperaba. ¿Cómo puedo hacer esto más rápido usando funciones vectoriales?
Como nota al margen, si limito el código anterior a 1000 bucles en i, solo lleva 2 segundos, pero 10,000 lleva 8 minutos. ¿Alguna idea de por qué?
Para responder a su pregunta sobre por qué el bucle de 10000 tomó mucho más tiempo que su bucle de 1000:
Creo que el principal sospechoso son las concatenaciones que están sucediendo en cada ciclo. A medida que los datos se hacen más largos, R probablemente copie cada elemento del vector en un nuevo vector que sea uno más largo. Copiar un pequeño conjunto de datos (500 elementos en promedio) 1000 veces es rápido. Copiar un conjunto de datos más grande (5000 elementos en promedio) 10000 veces es más lento.