################################################################################ ### R BASICS WORKSHOP ### ### PRESENTACIÓN 7: GENERACIÓN DE DATOS ### ### ### ### Center for Conservation and Sustainable Development ### ### Missouri Botanical Garden ### ### Sitio en la red: rbasicsworkshop.weebly.com ### ################################################################################ ### A. ¿POR QUÉ GENERAR DATA CON R? ############################################ # 1. Inventarse datos para publicar y ser famoso # 2. Explorar modelos teóricos, numérica o gráficamente # 3. Realizar simulaciones ### B. GENERAR SECUENCIAS REGULARES ############################################## # Funcion *c* x <- c(1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5) x # Operador *:* x <- 1:30 x # IMPORTANTE: Fijarse en la prioridad de los operadores 1:10-1 # Esto, no es lo mismo que esto: 1:(10-1) # funcion *rep* rep(1, 30) rep(1:4, 3) rep(1:4, each = 3) # funcion *scan* z <- scan() z # funcion *seq* seq(1, 5, 0.5) seq(length=9, from=1, to=5) # funcion *sequence* sequence(4:30) sequence(c(10,5)) # funcion *gl* (genera niveles de un factor) gl(3, 5) gl(3, 5, length=30) gl(2, 6, label=c("Male", "Female")) gl(2, 10) gl(2, 1, length=20) gl(2, 2, length=20) # funcion *expand.grid* expand.grid(a=c(60,80), p=c(100, 300), sexo=c("Male", "Female")) ### C. GENERAR SECUENCIAS ALEATORIAS ############################################# # Funcion *rnorm*: Gaussian (normal) x.norm <- rnorm(n=1000, mean=0, sd=1) x.norm hist(x.norm) # Otras distribuciones estadísticas disponibles en R # Poisson x.pois <- rpois(n=1000, lambda=5) hist(x.pois) # Uniforme x.unif <- runif(n=1000, min=0, max=1) hist(x.unif) # Exponential x.exp <- rexp(n=100, rate=1) hist(x.exp) par(mfrow=c(2,2)) # Esto crea una ventana con varios paneles (2x2) hist(x.norm, main="Normal") hist(x.pois, main="Poisson") hist(x.unif, main="Uniforme") hist(x.exp, main="Exponential") # Gamma # rgamma(n, shape, scale=1) # Weibull # rweibull(n, shape, scale=1) # Cauchy # rcauchy(n, location=0, scale=1) # Beta # rbeta(n, shape1, shape2) # Student t # rt(n, df) # Fisher-Snedecor (F) # rf(n, df1, df2) # Pearson chi-squared # rchisq(n, df) # binomial # rbinom(n, size, prob) # multinomial # rmultinom(n, size, prob) # geometric # rgeom(n, prob) # hypergeometric # rhyper(nn, m, n, k) # logistic # rlogis(n, location=0, scale=1) # lognormal # rlnorm(n, meanlog=0, sdlog=1) # negative binomial # rnbinom(n, size, prob) # Wilcoxon's statistics # rwilcox(nn, m, n) # rsignrank(nn, n) ### D. UN EJEMPLO BASADO EN UN ANÁLISIS ESPACIAL ################################# # En este ejemplo, vamos a simular la distribución de individuos (e.g. arboles) # dentro de un espacio rectangular (e.g. una parcela), y vamos a estudiar el # comportamiento de una medida de agregación bajo distintas distribuciones # teóricas. # Abra el paquete *spatstat* que se necesitara para análisis library(spatstat) # Defina el dominio espacial de la simulación max.coord <- 125 min.coord <- -125 domain <- cbind(c(min.coord, max.coord), c(min.coord, max.coord)) colnames(domain) <- c("x", "y") par(mfrow=c(1,1)) plot(domain, type="n") # Defina los siguientes valores para las simulaciones clumps.n <- 10^2 # El numero de grupos de individuos n.per.clump <- 4^2 # El numero de individuos dentro de cada grupo n <- n.per.clump*clumps.n # el numero total de individuos # Este es un objeto de clase *owin* que se necesitara luego, simplemente define # la ventana espacial para análisis distri.window <- owin(xrange=c(-100, 100), yrange=c(-100, 100)) class(distri.window) ## 1. Genere una distribución de individuos aleatoria ## rand.x <- runif(n, min.coord, max.coord) # secuencia aleatoria uniforme rand.y <- runif(n, min.coord, max.coord) # secuencia aleatoria uniforme coords.rand <- cbind(rand.x, rand.y) colnames(coords.rand) <- c("x", "y") dim(coords.rand) # Esto calcula el "pair-correlation function" que describe la distribución # espacial de individuos a varias distancias - valores de mas de 1 indican # agregación (mayor densidad de individuos), valores menores que uno indican # segregación (menor densidad de individuos). El valor 1 se espera bajo una # distribución aleatoria. Para saber mas, lee el archivo de ayuda # *?pcf* pcf.rand <- pcf(as.ppp(coords.rand, W=distri.window)) par(mfrow=c(1,2)) plot(domain, type="n", asp=1) plot(distri.window, col="red", add=TRUE) points(coords.rand) plot(pcf.rand) ## 2. Generamos una distribución de individuos perfectamente regular ## reg.x <- seq(domain[1,"x"], domain[2,"x"], length.out=sqrt(n)) # secuencia regular reg.y <- seq(domain[1,"y"], domain[2,"y"], length.out=sqrt(n)) # secuencia regular coords.reg <- expand.grid(reg.x, reg.y) # uso de *expand grid* colnames(coords.reg) <- c("x", "y") dim(coords.reg) pcf.reg <- pcf(as.ppp(coords.reg, W=distri.window)) par(mfrow=c(1,2)) plot(domain, type="n", asp=1) plot(distri.window, col="red", add=TRUE) points(coords.reg) plot(pcf.reg) ## 3. Una distribución de individuos agregados - agregación alta ## rand.x <- rnorm(n, 0, 6) rand.y <- rnorm(n, 0, 6) coords.agreg <- cbind(rand.x, rand.y) colnames(coords.agreg) <- c("x", "y") pcf.agreg <- pcf(as.ppp(coords.agreg, W=distri.window)) par(mfrow=c(1,2)) plot(domain, type="n", asp=1) plot(distri.window, col="red", add=TRUE) points(coords.agreg) plot(pcf.agreg) ## 4. Una distribución de individuos agregados - agregación baja ## rand.x <- rnorm(n, 0, 25) rand.y <- rnorm(n, 0, 25) coords.agreg.2 <- cbind(rand.x, rand.y) colnames(coords.agreg.2) <- c("x", "y") pcf.agreg.2 <- pcf(as.ppp(coords.agreg.2, W=distri.window)) par(mfrow=c(1,2)) plot(domain, type="n", asp=1) plot(distri.window, col="red", add=TRUE) points(coords.agreg.2) plot(pcf.agreg) ## 5. Una distribución a dos niveles - distribución regular de grupos y # distribución agregada de individuos dentro de grupos ## reg.clump.x <- seq(domain[1,"x"], domain[2,"x"], length.out=sqrt(clumps.n)) reg.clump.y <- seq(domain[1,"y"], domain[2,"y"], length.out=sqrt(clumps.n)) coords.clump.reg <- expand.grid(reg.clump.x, reg.clump.y) colnames(coords.clump.reg) <- c("x", "y") dist.x <- rnorm(n, 0, 2) dist.y <- rnorm(n, 0, 2) coords.reg.agreg <- cbind(coords.clump.reg[,"x"]+dist.x, coords.clump.reg[,"y"]+dist.y) pcf.reg.agreg <- pcf(as.ppp(coords.reg.agreg, W=distri.window)) par(mfrow=c(1,2)) plot(domain, type="n", asp=1) plot(distri.window, col="red", add=TRUE) points(coords.reg.agreg) points(coords.clump.reg, col="red") plot(pcf.reg.agreg)