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

Benilton Carvalho beniltoncarvalho em gmail.com
Terça Março 6 07:31:40 BRT 2012


geoComp nao esta' no CRAN... se, ao inves de mandar para o meu email,
for possivel apontar para o link onde eu posso baixa-lo, melhor.

Sobre o problema que vc descreve... Eu acho pouco provavel que o maior
problema seja o mvrnorm()... Dois complicadores claros sao: 1) o for(i
in 1:num.simu) e 2) o cbind(compos, compos1).

A unica coisa q vc precisaria fazer seria reescrever a parte interna
desse for() (ha' operacoes q nao precisam ser realizadas) e, depois,
paralelizar o proprio for() (nao ha' pq mexer nas funcoes usadas
dentro do for)... Apesar de que eu chego a arriscar que, uma vez
reescrito a parte interna do for, o ganho em paralelizar o for() pode
nao ser significativo.

b

2012/3/6 Junior Beleti <beleti.junior em gmail.com>:
> 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.
>
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código
> mínimo reproduzível.


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