[R-br] Criação de função fortran em pacote (base)

Junior Beleti beleti.junior em gmail.com
Terça Março 6 00:59:39 BRT 2012


Olá Benilton,

Primeiramente gostaria de agradecer novamente pela paciência e pela
atenção, e me desculpar por não ter conhecimento necessário sobre funções e
procedimentos estatísticos.

O foco da minha pesquisa é o processamento paralelo. Estou utilizando
scripts, (tais como de obtenção dos valores preditos utilizando os dados do
pivo), pois foi constatado problemas quanto ao tempo de processamento de
algumas rotinas desses scripts.

Na rotina de obtenção dos valores preditos utilizando os dados do pivo
(trecho a seguir), o problema quanto a tempo de processamento está na
chamada "preditos.simu <- volta.cokri(md.cov.ck,num.simu=1000,int.conf=0.95)".
(lembrando que tais scripts necessitam do pacote geoComp)

-------------------------------------------------------------------
require(geoComp)
require(MASS)
require(statmod)
require(geoR)
data(pivo)
dados <- pivo[,c(6,7,8,1,2)]
dados <- as.geoComp(dados)
bor <- cbind(c(0,seq(0,200,l=100),0),c(0,sqrt(200^2-seq(0,200,l=100)^2),0))
estima <- mec(dados)
gr <- pred_grid(bor, by=4)
md.cov.ck <- cokrigagem(estima[[1]]$Estimativas, loc=gr,dados.comp=dados)
preditos.gh <- volta.quad(md.cov.ck,n.pontos=7,Variancia=FALSE)
preditos.gh <- data.frame(preditos.gh)
write.table(preditos.gh,"pred_by4k7ns1000MBM.txt")
preditos.simu <- volta.cokri(md.cov.ck,num.simu=1000,int.conf=0.95) #Ponto
com problema quanto a processamento

preditos.simu <- data.frame(preditos.simu[[1]])
preditos.simu.ic <- data.frame(preditos.simu[[2]])
write.table(preditos.simu,"predsimu_by4k7ns1000MBM.txt")
write.table(preditos.simu.ic,"predsimuic_by4k7ns1000MBM.txt")
-------------------------------------------------------------------

Visando localizar o ponto em que a execução gasta um maior tempo de
processamento, "entrei" na função volta.cokri(código a seguir) e fui
investigar a causa da "demora" na execução dessa função.

-------------------------------------------------------------------
volta.cokri <-
function(mat.cokri, num.simu, retorna.tudo=FALSE, int.conf=0.95){
  nlinhas <- dim(mat.cokri[[1]])[1]
  compos1 <- data.frame(matrix(nrow=nlinhas/2,ncol=3))
  compos <- data.frame(matrix(nrow=nlinhas/2,ncol=3))

  for(i in 1:num.simu){
    g <- mvrnorm(n=1, mat.cokri[[1]],mat.cokri[[2]])
    seq1 <- seq(1,nlinhas,by=2)
    seq2 <- seq(2,nlinhas,by=2)
    y1 <- g[seq1]
    y2 <- g[seq2]
    gerado <- data.frame(y1,y2)
    compos <- agl(gerado)
    compos1 <- cbind(compos,compos1)
    }

  compos2 <- as.matrix(compos1)

  dim.vetor <- num.simu*3
  sy1 <- seq(1,dim.vetor,by=3)
  sy2 <- seq(2,dim.vetor,by=3)
  sy3 <- seq(3,dim.vetor,by=3)
  amostra1 <- as.matrix(compos2[,sy1],ncol=num.simu)
  amostra2 <- as.matrix(compos2[,sy2],ncol=num.simu)
  amostra3 <- as.matrix(compos2[,sy3],ncol=num.simu)

if(retorna.tudo == TRUE){
  retorna <- list()
  retorna[[1]] <- amostra1
  retorna[[2]] <- amostra2
  retorna[[3]] <- amostra3
  return(retorna)
}

if(retorna.tudo == FALSE){
  med1 <- apply(amostra1,1,mean)
  med2 <- apply(amostra2,1,mean)
  med3 <- apply(amostra3,1,mean)

  q1 <- t(apply(amostra1,1,quantile,prob=c(1-int.conf,int.conf)))
  q2 <- t(apply(amostra2,1,quantile,prob=c(1-int.conf,int.conf)))
  q3 <- t(apply(amostra3,1,quantile,prob=c(1-int.conf,int.conf)))
  quantis <- cbind(q1,q2,q3)
  resultado <- list()
  resultado$preditos <- data.frame(med1,med2,med3)
  names(resultado$preditos) <- c("Areia","Silte","Argila")
  resultado$intervalo <- data.frame(quantis)
  names(resultado$intervalo) <- c("LI Areia", "LS Areia", "LI Silte", "LS
Silte", "LI Argila", "LS Argila")
  return(resultado)}

}
-------------------------------------------------------------------

Na função volta.cokri verifiquei que o elevado tempo de processamento se
concentrava na chamada "g <- mvrnorm(n=1, mat.cokri[[1]],mat.cokri[[2]])".
Então desmembrei a função para realizar experimentos com pacotes paralelos
afim de criar modelos de execução paralelos.

A seguir está o trecho da função desmembrada.

-------------------------------------------------------------------
mat.cokri <- md.cov.ck

retorna.tudo=FALSE
int.conf=0.95

nlinhas <- dim(mat.cokri[[1]])[1]
compos1 <- data.frame(matrix(nrow=nlinhas/2,ncol=3))
compos <- data.frame(matrix(nrow=nlinhas/2,ncol=3))

mvrnorm <- function(n = 1, mu, Sigma, tol=1e-6, empirical = FALSE)
{
    p <- length(mu)
    if(!all(dim(Sigma) == c(p,p))) stop("incompatible arguments")
    eS <- eigen(Sigma, symmetric = TRUE, EISPACK = TRUE)
    ev <- eS$values
    if(!all(ev >= -tol*abs(ev[1L]))) ev <- ev *(-1)
    X <- matrix(rnorm(p * n), n)
    if(empirical) {
        X <- scale(X, TRUE, FALSE)
        X <- X %*% svd(X, nu = 0)$v
        X <- scale(X, FALSE, TRUE)
    }
    X <- drop(mu) + eS$vectors %*% diag(sqrt(pmax(ev, 0)), p) %*% t(X)
    nm <- names(mu)
    if(is.null(nm) && !is.null(dn <- dimnames(Sigma))) nm <- dn[[1L]]
    dimnames(X) <- list(nm, NULL)
    if(n == 1) drop(X) else t(X)
}

    m1 <- mat.cokri[[2]][1:2601,1:2601]   #divisao da matriz original
    m2 <- mat.cokri[[2]][2602:5202,1:2601]
    m3 <- mat.cokri[[2]][1:2601,2602:5202]
    m4 <- mat.cokri[[2]][2602:5202,2602:5202]

#chamada a funcao mclapply (neste exemplo esta com 1:4, mas que na execução
real seria 1:1000)
mclapply(1:4, function(i) {

    g1 <- mvrnorm(n=1, mat.cokri[[1]][1:2601],m1)
    g2 <- mvrnorm(n=1, mat.cokri[[1]][1:2601],m2)
    g3 <- mvrnorm(n=1, mat.cokri[[1]][1:2601],m3)
    g4 <- mvrnorm(n=1, mat.cokri[[1]][1:2601],m4)
    list(g1, g2, g3, g4)

},mc.cores=4
)
    g <- list(list(1:2601, g1), list(1:2601, g2), list(1:2601,
g3),list(1:2601, g4))
    seq1 <- seq(1,nlinhas,by=2)
    seq2 <- seq(2,nlinhas,by=2)
    y1 <- g[seq1]
    y2 <- g[seq2]
    gerado <- data.frame(y1,y2)
    compos <- agl(gerado)
    compos1 <- cbind(compos,compos1)


  compos2 <- as.matrix(compos1)


-------------------------------------------------------------------

Esses trechos de código podem reproduzir o problema. Se não tiver o pacote
geoComp, posso lhe enviar por email.
Meu email é beleti.junior em gmail.com

Sobre a possivel solução apresentada, consegui aplica-lá.
Mais uma vez agradeço a sua disposição e peço desculpas pelo encomodo.

Att, Carlos Beleti.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20120306/c29da6c2/attachment.html>


Mais detalhes sobre a lista de discussão R-br