############################################################################### # Analisis de redes sociales y capital social (2017) ############################################################################### library(sna) ############################################################################### # Simulamos una matriz y creamos variables o atributos de los actores # Creamos un vector con los nombres de los actores nombres<- c( "Jose", "Romina","Alicia","Maco","Jesica", "Armando", "Fabiola","Tatiana", "Julio","Pedro", "Juan", "Kike", "Rolas", "Roberto") # Como primer atributo de los actores creamos un vector con el género sexo= c("M", "F","F","F","F", "M", "F","F", "M","M","M","M","M","M" ) # El año en que concluyeron sus estudios de licenciatura graduados=c(sample(1990:2012, length(nombres), replace = TRUE)) # Desde el punto de vista social: liberal o conservador # Liberal= pro-eleccion (aborto), matrimonios del mismo sexo... perspectiva_social= c(sample(c("L", "C"), length(nombres), replace = TRUE)) ############################################################################### # FUNCION 1 ############################################################################### # Comparo el sexo el elemento 1 del vector, o sea de José con el del resto de los # actores, si es igual da TRUE sino FALSE # atributo 1 vector variable categórica, homofilia (0-1), etiquetas # vector con el nombre o etiqueta de los actores comparar_attributos <- function(atributo1,etiquetas,homofilia){ xeAll=vector() for(i in 1:length(atributo1)) {xen=atributo1[i]==atributo1 #comparo cada actor con el resto xeAll=c(xeAll,xen) } A = matrix( xeAll, # elementos nrow=length(atributo1), # hileras ncol=length(atributo1), # columnas byrow = TRUE) # llenar por hileras ################################################################################# # asigno lazos en base a homofilia for(i in 1:nrow(A)) { for(j in 1:ncol(A)) { ###########checa solo cambie las reglas if (A[i,j]) {A[i,j]=rbinom(1,1,homofilia)} else # homofilia {A[i,j]=rbinom(1,1,1-homofilia)} }####cierro loop para row (hileras) }####cierro loop para col (columnas) ################################################################################# #### nombres colnames(A)<-etiquetas rownames(A)<-etiquetas #diagonal la vuelvo ceros diag(A)<-0 A } #### cierro la función ################################################################################## #### USAMOS LA FUNCION 1 #### para crear una variable dependiente #### usamos una vinculación preferencial del 50% o más bien no hay preferencia #### para vincularse dado el género de los actores colaboracion=comparar_attributos(sexo,nombres,0.50) colaboracion; class(colaboracion); dim(colaboracion) ############################################################################### # Algunas ocasiones hay problemas con los acentos # Acentos # \u{ED} i con acento # \u{E1} a con acento # \u{F3} o con acento # \u{F1} ñ # \u{E9} e con acento # \u{FA} u con acento ############################################################################### #### visualizamos la gráfica ### FIGURA 1 ############################################################################### plot.sociomatrix(colaboracion, asp=0.5, main="Figura 1. red de colaboraci\u{F3}n, preferencia por el mismo g\u{E9}nero 50%") ############################################################################### # FUNCION 2 ############################################################################### ### Esta función crea una matriz que adopta valores de 1 si el actor i y el ### actor j comparten el mismo atributo comparar_binario <- function(atributo2,etiquetas){ xeAll=vector() for(i in 1:length(atributo2)) {xen=atributo2[i]==atributo2 #comparo cada actor con el resto xeAll=c(xeAll,xen) } A = matrix( xeAll, # elementos nrow=length(atributo2), # hileras ncol=length(atributo2), # columnas byrow = TRUE) # llenar por hileras ############################################################################## # asigno lazos en base a homofilia for(i in 1:nrow(A)) { for(j in 1:ncol(A)) { ###########checa solo cambie las reglas if (A[i,j]) {A[i,j]=1} else # 1 si ambos comparten un atributo {A[i,j]=0} }####cierro loop para row (hileras) }####cierro loop para col (columnas) ############################################################################# #### nombres colnames(A)<-etiquetas rownames(A)<-etiquetas #diagonal la vuelvo ceros diag(A)<-0 A } #### cierro la función ############################################################################### ### Usamos la FUNCION 2 para crear una variable independiente A_sexo=comparar_binario(sexo,nombres) ############################################################################### # Coeficiente de correlacion diag(colaboracion)<-NA diag(A_sexo)<-NA cor(as.vector(colaboracion), as.vector(A_sexo), use = "complete.obs") ############################################################################### colab_qap=qaptest(list(colaboracion,A_sexo), gcor, g1=1, g2=2, reps=10000) summary(colab_qap) colab_qap$pgreq colab_qap$pleeq colab_qap$testval colab_qap$dist ############################################################################### # Figura 2 ############################################################################### d <- density(colab_qap$dist) plot(d,lwd=2, main="Figura 2. QAP: 10 mil replicas del coeficiente de correlaci\u{F3}n", xlab="Coeficiente de correlaci\u{F3}n", ylab="Densidad") polygon(d, col="grey", border="black");abline(v=colab_qap$testval,col="red", lwd=2, lty=3) polygon(c(d$x[d$x>=colab_qap$testval], colab_qap$testval ), c(d$y[d$x>=colab_qap$testval],0 ), col="red") legendXY<-locator(1) text(legendXY, paste("Área coeficiente > \n",round(colab_qap$testval,3), "=",colab_qap$pgreq), cex=.85, col="white") ############################################################################### # ¿existe una preferencia a colaborar con actores sociales del mismo género? # Homofilia de género. # No se observó una vinculación preferencial de género en la red de colaboración, # tal como lo indica el coeficiente de correlación r = 0.02886951 (p = 0.4212). ############################################################################### # FUNCION 3 ############################################################################### ### Esta función se utiliza también para construir una matriz de variables ### independientes. En este caso calcula la diferencia absoluta del valor ### de la variable "x" entre los actor i y j comparar_dif_abs <- function(atributo3,etiquetas){ xeAll=vector() for(i in 1:length(atributo3)) {xen=abs(atributo3[i]-atributo3) #comparo cada actor con el resto xeAll=c(xeAll,xen) } A = matrix( xeAll, # elementos nrow=length(atributo3), # hileras ncol=length(atributo3), # columnas byrow = TRUE) # llenar por hileras #### nombres colnames(A)<-etiquetas rownames(A)<-etiquetas #diagonal la vuelvo ceros diag(A)<-NA A } #### cierro la función ################################################################################## # Aplicamos la FUNCION 3 A_grad=comparar_dif_abs(graduados,nombres) ################################################################################## grad_qap=qaptest(list(colaboracion,A_grad), gcor, g1=1, g2=2, reps=10000) summary(grad_qap) plot(grad_qap, xlim=c(-0.7, 0.4)) ### en este caso tampoco hay correlaciion ni es esta significativa ############################################################################### # FUNCION 4 ############################################################################### # Esta funcion se puede modificar de muchas formas, la idea es de que # a mayor diferencia absoluta entre el valor de una variable para dos # actores menos probabilidad de ocurrencia de un lazo # beta1 adopta entonces un valor negativo (0.1 a 0.5) # se recomienda al lector personalizar la sensibilidad de estos valores comparar_attributos1 <- function(atributo4,etiquetas,beta1){ x1=as.vector(atributo4) # vectorizo beta0 <- mean(x1, na.rm=T) # el promedio beta1 <- beta1 # sensibilidad pi_x <- exp(beta0 + beta1 * x1) / (1 + exp(beta0 + beta1 * x1)) y <- rbinom(n=length(x1), size=1, prob=pi_x) A = matrix( y, # elementos nrow=length(etiquetas), # hileras ncol=length(etiquetas), # columnas byrow = TRUE) # llenar por hileras #### nombres colnames(A)<-etiquetas rownames(A)<-etiquetas #diagonal la vuelvo ceros diag(A)<-NA A } ############################################################################### Colaboracion_grad=comparar_attributos1(A_grad,nombres, -0.3) cor(as.vector(Colaboracion_grad), as.vector(A_grad), method = "pearson", use = "complete.obs") grad_qap=qaptest(list(Colaboracion_grad,A_grad), gcor, g1=1, g2=2, reps=10000) summary(grad_qap) grad_qap$pgreq grad_qap$pleeq grad_qap$testval grad_qap$dist ############################################################################### # Figura 3 ############################################################################### d <- density(grad_qap$dist) plot(d,lwd=2, main="Figura 3. QAP: 10 mil replicas del coeficiente de correlaci\u{F3}n", xlab="Coeficiente de correlaci\u{F3}n", ylab="Densidad", xlim=c(-0.4, 0.3)) polygon(d, col="grey", border="black");abline(v=grad_qap$testval,col="red", lwd=2, lty=3) polygon(c(d$x[d$x>=grad_qap$testval], grad_qap$testval ), c(d$y[d$x>=grad_qap$testval],0 ), col="red") legendXY<-locator(1) text(legendXY, paste("Área coeficiente < \n",round(grad_qap$testval,3), "=",grad_qap$pleeq), cex=.85, col="black") ###############################################################################
QAP Correlación entre matrices
Dr. Luis Alan Navarro Navarro
Centro de Estudios en Gobierno y Asuntos Públicos
El Colegio de Sonora