Matrices a usar internamente

La función crea.bloque permite crear una matriz en bloque a partir de dos matrices:

crea.bloque<-function(mat1,mat2){
  nf1<-nrow(mat1);nc1<-ncol(mat1)
  nf2<-nrow(mat2);nc2<-ncol(mat2)
  mat1<-cbind(mat1,matrix(0,nrow=nf1,ncol=nc2))
  mat2<-cbind(matrix(0,nrow=nf2,ncol=nc1),mat2)
  matdef<-rbind(mat1,mat2)
  return(matdef)
}

La funcion ceros.a.5 corrige los ceros en 0.5

ceros.a.5<-function(Tabla){
  Nro.col<-ncol(Tabla)
  if(any(Tabla==0))Tabla<-matrix(ifelse
                                 (as.vector(Tabla)==0,0.5,Tabla),ncol=Nro.col)
  return(Tabla)
}

La funcion identidad permite construir una matriz diagonal con k elementos iguales a 1 en su diagonal principal

identidad<-function(k)diag(rep(1,k))

La funcion bloque permite construir una matriz donde su primera fila esta compuesta de ceros y debajo se adiciona una matriz diagonal con k elementos iguales a 1 en su diagonal principal.

bloque<-function(k)rbind(0,identidad(k))

La funcion repita toma dos matrices apartir de las cuales se genera una nueva matriz de mayor dimension. La primera matriz aparece en las primeras columnas y la segunda se adiciona ocupando las ultimas columnas de la nueva matriz generada. Cada fila aparece repetida k veces una debajo de la otra.

repita<-function(X,X2,k){
  temp<-NULL
  for(i in 1:nrow(X))temp<-rbind(temp,cbind
                                 (matrix(rep(X[i,],k),ncol=ncol(X),byrow=T),X2))
  return(temp)
}

Datos para el ejemplo

nro.vars<-2  
Nro.Estratos<-12 # Combinacion covariables con P+ y P-
niveles<-c(2,3) # #niveles primer covariable, # niveles segunda covariable

Generación de datos

set.seed(21)
datos <- replicate(6,sample(15:35,4, replace = TRUE)) 
N <- matrix(datos, 12, 2, byrow = T)

GSK

###Matriz de Diseño

matriz.diseño<-function(nro.vars,niveles){
  niveles<-niveles-1
  temp1<-bloque(niveles[nro.vars])
  for(i in (nro.vars-1):1){
    temp2<-bloque(niveles[i])
    temp1<-repita(temp2,temp1,nrow(temp1))
  }
  temp<-cbind(1,temp1)
  temp<-temp[rep(1:nrow(temp),each=2),]
  indi<-matrix(rep(c(0,1),nrow(temp)/2),ncol=1)
  temp2<-NULL
  for(ii in 1:ncol(temp)) temp2<-cbind(temp2,indi)
  return(cbind(temp,temp*temp2))
}



X <- matriz.diseño(2,c(2,3))
set.seed(21)
datos <- replicate(6,sample(15:35,4, replace = TRUE)) 
N <- matrix(datos, 12, 2, byrow = T)

nro.vars<-2

A <- matrix(c(1,0,0,0,
              0,0,0,1),ncol=4,byrow=T)

Nro.Estratos<-12
niveles<-c(2,3)

Función

logistica.bivariable<-function(N,Nro.Estratos,A,X,nro.vars,niveles,                               imprimir.inter=T){   #Le quite alpha
  

A<-kronecker(identidad(Nro.Estratos/2),A)
print('Matriz A')
print(A)


#Convertir la matriz N en un vector

N<-matrix(t(N),ncol=1,byrow=F)
print('Tabla de contingencia como vector')
print(N)

# Convertir los ceros que puedan haber en la matriz N a 0.5 
# usando la funcion auxiliar ceros.a.5

N<-ceros.a.5(N)
print('ceros a 0.5')
print('N')



#calcular el vector pi-gorro  
donde.voy<-0
for(i in 1:Nro.Estratos){
 # i=1
  identifica<-c('Estrato ',i)
  print(identifica)
  
  
  temp<-N[(donde.voy+1):(donde.voy+2)]
  print('Frecuencias de la subpoblación')
  print(temp)
  donde.voy<-donde.voy+2
  n.temp<-sum(temp)
  
  probab<-matrix(temp/n.temp,ncol=1)
  print('p estimado del estrato')
  print(t(probab))
  
  temp1<- t(probab)
  temp2<-rev(probab)
  varcov.p<-(matrix(c(temp1, temp2), 2, byrow = T))/n.temp    
  
  print('Matriz de varianzas y covarianzas estimada del estrato')
  print(varcov.p)
 
  
  #Matriz de varianza y covarianzas pi-gorro
  if(i==1){
    varcov.grande<-varcov.p
    prob.grande<-probab
  }
  else{
    varcov.grande<-crea.bloque(varcov.grande,varcov.p)
    prob.grande<-rbind(prob.grande,probab)
    print('vector que acumula las probabilidades de todos los estratos anteriores')
    print(prob.grande)
  }
}


#Calcular el vector f = A*pi-gorro
f<-A%*%prob.grande
print('vector f= A*pi-gorro')
print(f)

# Calculo de la matriz de varianzas y covarianzas  Sigma f gorro    (A*sigma pi-gorro*A') 
var.cov.f<-A%*%varcov.grande%*%t(A)
print('var.cov.f gorro')
print(var.cov.f)

# Calcular los betas utilizando inversa generalizada y 

library(MASS)
temp<-solve(t(X)%*%ginv(var.cov.f)%*%X)
beta<-temp%*%t(X)%*%ginv(var.cov.f)%*%f
print('Betas estimados')
print(beta)
# matriz de varianzas y covarianzas del modelo
#o matriz de varianzas y covarianzas de beta
Sigma.beta<-temp
print('Matriz de varianzas y covarianzas de Beta')
print(Sigma.beta) 

# Calcular  estimacion de f-gorro, osea f* 
f.gor<-X%*%beta
print('f.gorro*')
print(f.gor)


# error, Z score, p-valor
Z<-nrow(beta)/2
LM<-function(f,X,Sf){
  require(MASS)
  temp<-t(X)%*%ginv(Sf)
  varcov.b<-solve(temp%*%X)
  beta<-varcov.b%*%temp%*%f
  valores.z<-beta/sqrt(diag(varcov.b))
  estadisticos<-cbind(beta,sqrt(diag(varcov.b)),valores.z,2*pnorm(abs(valores.z),lower.tail=F))
  colnames(estadisticos)<-c('beta','error','z-valor','p-valor')
  estadisticos_sensibilidad <- estadisticos[1:Z,]
  print('********** Estimacion del modelo para la sensibilidad *****************')
  print(estadisticos_sensibilidad)
  print('*********************************************')
  estadisticos_especificidad <- estadisticos[(Z+1):nrow(beta),]
  print('********** Estimacion del modelo para la especificidad*****************')
  print(estadisticos_especificidad)
  print('*********************************************')
}

LM(f,X,var.cov.f)



################## Inferencia sobre el modelo
# Pruebas globales
 Z<-nrow(beta)/2
 #Prueba Global para f1
  betaf1<-beta[c(2:Z),]
  Sigma.betaf1<-Sigma.beta[c(2:Z),c(2:Z)]
  mi.chitempf1g<-t(betaf1)%*%solve(Sigma.betaf1)%*%(betaf1)
  #print('Chi cuadrado global para f1')
  #print(mi.chitempf1g)
  y <- qr(Sigma.betaf1)
  gltempgf1g<-y$rank 
  valor.ptempf1g<-pchisq(mi.chitempf1g,gltempgf1g,lower.tail=F)
  #print('Valor p prueba global f1')
  #print(valor.ptempf1g)
  
  #Prueba global para f2
  P<-Z+1
  betaf2<-beta[-c(1,P),]
  Sigma.betaf2<-Sigma.beta[-c(1,P),-c(1,P)]
  
  mi.chitempf2g<-t(betaf2)%*%solve(Sigma.betaf2)%*%(betaf2)
  #print('Chi cuadrado global para f2')
  #print(mi.chitempf2g)
  
  y2 <- qr(Sigma.betaf2)
  gltempgf2g<-y2$rank 
  valor.ptempf2g<-pchisq(mi.chitempf2g,gltempgf2g,lower.tail=F)
  #print('Valor p prueba global f2')
  #print(valor.ptempf2g)

Tabla_pGlobal <- cbind(c(mi.chitempf1g, mi.chitempf2g), c(valor.ptempf1g, valor.ptempf2g))
colnames(Tabla_pGlobal)<-c('chi-cuadrado','p-valor')
rownames(Tabla_pGlobal)<-c('Sensibilidad','especificidad')
  print('********** Pruebas globales *****************')
print(Tabla_pGlobal)




#### Pruebas de coeficientes individuales
#Pruebas chi cuadrado para los parametros individuales para sensibilidad    
print('********** Pruebas de coeficientes individuales *****************')
chi.cua<-beta^2/diag(Sigma.beta)
print('Pruebas individuales para beta')
print(chi.cua)
Z <- nrow(beta)/2
print('Z')
print(Z)
chi.cuaf1 <- chi.cua[c(1:Z)]
print('*********************************************')
print('Pruebas individuales para parametros de la sensibilidad')
print(chi.cuaf1)
valor.pf1 <- pchisq(chi.cuaf1,1,lower=F)
#valor.p<-pchisq(chi.cua,1,lower=F)  # se redicieron estas dos lineas en la anterior
#valor.pf1<-valor.p[c(1:Z)]
print('Valor-p sensibilidad')
print(valor.pf1)


#Pruebas chi cuadrado para los parametros individuales para especificidad
print('*********************************************')
print('Pruebas individuales para parametros de la especificidad')
Cf2<-identidad(ncol(X)/2)
Cf2<-cbind(Cf2,Cf2)
# print(Sigma.beta)  No la imprimi
for(i in 2:nrow(Cf2)){
  tempf2 <- matrix(Cf2[i,],nrow=1)
  S.temp <- tempf2%*%Sigma.beta%*%t(tempf2)
  mi.chitempf2 <- (tempf2%*%beta)%*%solve(S.temp)%*%(tempf2%*%beta) 
  #gltempf2 <- nrow(tempf2)
  #valor.ptempf2 <- pchisq(mi.chitempf2,gltempf2,lower.tail=F)
  valor.ptempf2 <- pchisq(mi.chitempf2,1,lower.tail=F) # C es vector por eso el 1 =g= rango de C
 # print(paste('Coeficiente', (i-1)))
  #print('Coeficiente...')
  #print(i-1)
  print(paste('Matriz de Pruebas individuales sobre las variables de la especificidad, Coeficiente', (i-1)))
  print(tempf2)
  print('Chi.obs.....Grados de libertad....Valor-p')
  print(c(mi.chitempf2,1,valor.ptempf2))
}





### Pruebas individuales sobre las variables 
print("", quote = FALSE)
print('********** Pruebas individuales sobre las variables *****************')
print("", quote = FALSE)
#Pruebas individuales para las variables sensibilidad

for(i in 1:nro.vars){
  
  filas.cv <- niveles[i]-1
  Cv <- matrix(0,ncol=ncol(X),nrow=filas.cv)
  
  finalizav <- 1 + sum(niveles[1:i]-1)
  iniciav <- finalizav - (niveles[i]-1) + 1
  for(j in 1:nrow(Cv)) {
    Cv[j,iniciav-1+j] <- 1
    }
  
  # mi.chiv<-t(Cv%*%beta)%*%solve(Cv%*%Sigma.beta%*%t(Cv))%*%Cv%*%beta
  mi.chiv <- t(Cv%*%beta)%*%solve(Cv%*%Sigma.beta%*%t(Cv))%*%Cv%*%beta
  
  gl <- nrow(Cv)
  valor.p <- pchisq(mi.chiv,gl,lower.tail=F)
  #print('Variable...')
  #print(i)
  #print('Matriz de Pruebas individuales  sobre las variables de la sensibilidad')
  print(paste('Matriz de Pruebas individuales de la sensibilidad con respecto a la variable', i))
  print(Cv)
  print('Chi.obs.....Grados de libertad....Valor-p')
  print(c(mi.chiv,gl,valor.p))
  
} # for i



#Pruebas individuales para las variables especificidad
print("", quote = FALSE)
for(i in 1:nro.vars){
  
  filas.cv <- niveles[i] - 1
  Cv1 <- matrix(0,ncol=ncol(X)/2,nrow=filas.cv)
  
  finalizav1 <- 1 + sum(niveles[1:i]-1)
  iniciav1 <- finalizav1 - (niveles[i]-1) + 1
  for(j in 1:nrow(Cv1)) {Cv1[j,iniciav1-1+j] <- 1}
  
  Cv2 <- matrix(0,ncol=ncol(X)/2,nrow=filas.cv)
  
  finalizav2 <- 1 + sum(niveles[1:i]-1)
  iniciav2 <- finalizav2 - (niveles[i]-1) + 1
  for(j in 1:nrow(Cv2)) {Cv2[j,iniciav1-1+j] <- 1}
  
  Cvf2 <- cbind(Cv1,Cv2)
  
  mi.chicvf2 <- t(Cvf2%*%beta)%*%solve(Cvf2%*%Sigma.beta%*%t(Cvf2))%*%Cvf2%*%beta
  glcvf2 <- nrow(Cvf2)
  valor.pcvf2 <- pchisq(mi.chicvf2,glcvf2,lower.tail=F)
  #print('Variable...')
  #print(i)
  print(paste('Matriz de Pruebas individuales de la especificidad sobre la variable ', i))
  print(Cvf2)
  print('Chi.obs.....Grados de libertad....Valor-p')
  print(c(mi.chicvf2,glcvf2,valor.pcvf2))
  
} # for i




## Pruebas de Contraste sobre las Variables
print("", quote = FALSE)
print('********** Pruebas de Contraste sobre las Variables *****************')

# Contrastes para la sensibilidad
if(any(niveles>2)){
  
  for(i in 1:nro.vars){
    if(niveles[i]>2){
      
      filas.con<-niveles[i]-2
      # Si la matriz de dise?o no tiene incluido el intercepto use...
      # Con<-matrix(0,ncol=ncol(X),nrow=filas.con)
      # Si la matriz de dise?o  tiene incluido el intercepto use...
      Con<-matrix(0,ncol=ncol(X),nrow=filas.con)
      
      finaliza <- 1+sum(niveles[1:i]-1)
      inicia <- finaliza-(niveles[i]-1)+1
      Con[1:nrow(Con),inicia] <- 1
      for(j in 1:nrow(Con)) {Con[j,inicia+j] <-  -1}
      mi.chi <- t(Con%*%beta)%*%solve(Con%*%Sigma.beta%*%t(Con))%*%Con%*%beta
      gl <- nrow(Con)
      valor.p <- pchisq(mi.chi,gl,lower.tail=F)
      #print(paste('Variable...',i))
      #print(i)
      #print('Matriz de contrastes')
      print("", quote = FALSE)
      print("Sensibilidad", quote = FALSE)
      print(paste('Matriz de contrastes variabls', i))
      print(Con)
      print('Chi.obs.....Grados de libertad....Valor-p')
      print(c(mi.chi,gl,valor.p))
    } # Fin if
    
  } # for i
  
} #fin if any
# Contrastes para la especificidad 

if(any(niveles>2)){
  
  for(i in 1:nro.vars){
    if(niveles[i]>2){
      
      filas.con <- niveles[i]-2
      
      Con1 <- matrix(0,ncol=ncol(X)/2,nrow=filas.con)
      
      finaliza <- 1+sum(niveles[1:i]-1)
      inicia <- finaliza-(niveles[i]-1)+1
      Con1[1:nrow(Con1),inicia] <- 1
      for(j in 1:nrow(Con1))Con1[j,inicia+j] <- -1
      
      Con2 <- matrix(0,ncol=ncol(X)/2,nrow=filas.con)
      finaliza2 <- 1+sum(niveles[1:i]-1)
      inicia2 <- finaliza2-(niveles[i]-1)+1
      Con2[1:nrow(Con2),inicia2] <- 1
      for(j in 1:nrow(Con2)) {Con2[j,inicia+j]<- -1}
      
      
      Conf2 <- cbind(Con1,Con2)
      mi.chi2 <- t(Conf2%*%beta)%*%solve(Conf2%*%Sigma.beta%*%t(Conf2))%*%Conf2%*%beta
      gl2 <- nrow(Conf2)
      valor.p2 <- pchisq(mi.chi2,gl2,lower.tail=F)
      #print(paste('Variable...',i))
      #print(i)
      print("", quote = FALSE)
      print("Especificidad", quote = FALSE)
      print(paste('Matriz de contrastes variable', i))
      print(Conf2)
      print('Chi.obs.....Grados de libertad....Valor-p')
      print(c(mi.chi2,gl2,valor.p2))
      
      
      
    } # Fin if
    
  } # for i
  
} #fin if any





}# Fin funcion principal
logistica.bivariable(N=N,Nro.Estratos=12,A=A,X=X,nro.vars=2,niveles=c(2,3))