Perfil Programación máxima de probabilidad en r -- performance campo con r camp codereview Relacionados El problema

Profile maximum likelihood programming in R


1
vote

problema

Español

Estoy calculando una superficie de probabilidad para una distribución binomial negativa modificada con dos parámetros: media R y dispersión k (la distribución de probabilidad está 'modificada' para tener en cuenta el total Distribuciones de tamaño de redes, por lo que no puede usar MLE inherente (es decir, 9988777665544332 )). Por lo tanto, estoy ejecutando datos simulados a través de las diversas funciones a continuación para obtener un punto estimado y un intervalo de confianza.

Dado que la MLE de k se basa en R , estoy usando Probabilidad de perfil Mi enfoque a esto es creando una matriz de R k6 valores y luego obtener la probabilidad de registro de cada permutación y encontrar dónde se maximiza.

El código actual logra mi objetivo de calcular un punto de estimación y un intervalo de confianza, pero no requiere mucho tiempo: No sé si la velocidad es simplemente inherente con R que tiene que calcular las matemáticas por cada permutación, o Si hay una manera de mejorar la velocidad a través del código. con un conjunto de datos simulado de longitud 500, se tarda unos 30 minutos. Estoy simulando datos de 50 a 2000 varios cientos de veces, así que imagina que algunos de ellos tendrán que correr durante horas. Mejorar la velocidad ahorrará días críticos.

Las siguientes funciones calculan la superficie de probabilidad a través de un rango de R y k valores. La función surflike_yn es el proceso de consumo de tiempo, ya que ejecuta las otras funciones para cada combinación de k0 y 99887766555443311 .

My pregunta es cómo mejorar el rendimiento / tiempo de estas funciones. Por lo general, uso r para procesos mucho más simples y nunca he necesitado considerar realmente el rendimiento hasta ahora.

  k2  

A continuación, estoy proporcionando un código que utilizo para simular datos para ejecutar estas funciones ( Esto no necesita necesariamente una revisión ; Utilizo estas funciones en otros procesos, por lo que pueden no optimizarse)

Mis datos simulados son una matriz de dos columnas. La primera columna son las distribuciones de tamaño (Y), el segundo es la cantidad de valores que está condicionada (es decir, P (y | n) Si dos redes no pueden bromear de manera inequívoca, apart-N es casi siempre 1 en la práctica)

  k3  
Original en ingles

I am calculating a likelihood surface for a modified negative binomial distribution with two parameters: mean R and dispersion k (the probability distribution is 'modified' to account for total size distributions of networks, so cant use inherent MLE (i.e. MASS::fitdistr)). Thus, I'm running simulated data through the various functions below to obtain a point estimate and confidence interval.

Since the MLE of k is predicated on R, I am using profile likelihood My approach to this is by creating a matrix of R and k values, then getting the log-likelihood of each permutation and finding where it is maximized.

The current code achieves my goal of calculating a point estimate and confidence interval, but is very time consuming - I don't know if the speed is just inherent with R having to calculate the math for each permutation, or if there is a way to improve the speed through code. With a simulated dataset of length 500, it takes about 30 minutes. I am simulating data from lengths of 50 to 2000 several hundred times times, so imagine some of them will have to run for hours. Improving the speed will save critical days.

The below functions calculate the likelihood surface across a range of R and k values. The function surflike_yn is the time consuming process, as it runs the other functions for each combination of R and k.

My question is how to improve the performance/time of these functions. I typically use R for much simpler processes and have never needed to truly consider performance until now.

#Probability distribution nb_yn <- function(y,n,R,k) {   logpyn <- log(n) - log(y) + lgamma(k*y+y-n) - lgamma(k*y) - lgamma(y-n+1) + log((R/k)^(y-n)/(1+R/k)^(k*y+y-n))   return(logpyn)                                                }  # Likelihood function like_yn<- function(simdata,r1,k1){   runs <- nrow(simdata)   liks <- rep(1,runs)   for(z in 1:runs){     liks[z] <- nb_yn(simdata[z,1],simdata[z,2],r1,k1)   }   sum(liks) }  # Calculate likelihood surface (***this is the time consuming step***) surflike_yn<- function(simdata,Rrange,krange){   likesurf <- data.frame(matrix(NA, nrow=length(Rrange),length(krange)))   for(i in 1:length(Rrange)){     for(j in 1:length(krange)){       likesurf[i,j] <- like_yn(simdata,Rrange[i],krange[j])     }   }   likesurf }  #Get point and CI estimates surfests_yn<-function(likesurf,likesurf_max,conf.interval){   chiV<-qchisq(conf.interval/100, df=1)/2    prfk <- apply(likesurf,2,function(x){max(x)})   prfk2 <- krange[prfk-max(prfk)>-chiV]   prfR <- apply(likesurf,1,function(x){max(x)})   prfR2 <- Rrange[prfR-max(prfR)>-chiV]    output <- matrix(NA,2,3)   output[1,1] <- Rrange[sum(seq(1,length(Rrange))%*%likesurf_max)]   output[1,2] <- min(prfR2)   output[1,3] <- max(prfR2)   output[2,1] <- krange[sum(likesurf_max%*%seq(1,length(krange)))]   output[2,2] <- min(prfk2)   output[2,3] <- ifelse(max(prfk2)==max(krange),Inf,max(prfk2))   colnames(output) <- c("point_est","lower_ci","upper_ci"); rownames(output) <- c("R","k")   return(output) } 

Below, I am providing code that I use to simulate data to run these functions (this does not necessarily need review; I use these functions in other processes which is why they may not be optimized)

My simulated data are a two column matrix. The first column are the size distributions (Y), the second is how many values this is conditioned on (i.e. P(Y|n) if two networks cant be unambiguously teases apart - n is almost always 1 in practice)

#Set up R and k "search grid" for profile likelihood Rlow=0.05; Rhigh=1.05; Rrange=seq(Rlow,Rhigh,by=0.01) klow=0.04; khigh=55; krange=seq(klow,khigh,by=0.01)  #Generate dummy data with R=0.5 and k=0.25 and ALL index cases=1   #Brancing process function bp <- function(gens=20, init.size=1, offspring, ...){     Z <- list(); Z[[1]] <- init.size; i <- 1    while(sum(Z[[i]]) > 0 && i <= gens) {      Z[[i+1]] <- offspring(sum(Z[[i]]), ...)      i <- i+1    }    return(Z) }    #generate data (n=100) set.seed(2020) ind<-replicate(100,bp(offspring=rnbinom, size=0.25,mu=0.5))  clust<-t(data.frame(lapply(ind,function(x) sum(unlist(x))))) Yn <- cbind(clust,rep(1,times=length(clust))) #2 x n matrix will all index cases=1  #Calculate surface likelihoods and parameter estimates   start_time <- Sys.time() surf <- surflike_yn(Yn,Rrange,krange)   end_time <- Sys.time()   duration <- end_time - start_time surf_max <- surf==max(surf) surfests_yn(surf,surf_max,95) 
     
   
   

Lista de respuestas


Relacionados problema

1  Intervalo de confianza simultánea  ( Simultaneous confidence interval ) 
Recientemente leí un artículo en el que los autores presentan algoritmo 1 para calcular un intervalo de confianza simultáneo. Me interesaba implementar el a...

4  Vectorizamos la prueba exacta de Fisher  ( Vectorize fishers exact test ) 
Tengo dos marcos de datos / listas de datos, humanSplit 9988776655544331 , y son del formulario > ratSplit$Kidney_F_GSM1328570 ratGene ratRepli...

2  Invertir una función a través de una búsqueda  ( Invert a function via a lookup ) 
El objetivo de esta función es invertir una función de impuesto a la renta. Es decir, dado el impuesto pagado y el año financiero, la función debe devolver el...

0  Text2VEC - Fit_Transform, $ Transform TF-IDF  ( Text2vec fit transform transform tf idf ) 
Lo siento si este es un lugar equivocado para publicar una pregunta. Tengo dos preguntas: ~ A) Estoy tratando de hacer similitud de texto utilizando la simi...

4  Código imperativo en r manteniendo un seguimiento del estado  ( Imperative code in r keeping track of state ) 
Un amigo mío tiene una hoja de cálculo donde codificó un video en el aula para varios eventos de enseñanza, que necesitaba para ayudarla. Para cada grabación,...

3  Script de filtro más elegante en r  ( More elegant filter script in r ) 
Soy muy nuevo tanto para programar como para que, por favor, tenga en cuenta conmigo :-) He escrito el siguiente bit de código, que funciona perfectamente bie...

9  Generador de tabla de verdad para una función arbitraria  ( Truth table generator for an arbitrary function ) 
Summary : esta función genera una tabla de verdad para una función booleana de número de argumentos variables. El nombre de la función pasó y sus argumentos ...

3  Correlación y dependencia  ( Correlation and dependence ) 
Es bien sabido que 0 dependencia implica 0 correlación, mientras que 0 correlación no implica 0 dependencia. Tengo un papel aquí que ilustra los coeficiente...

4  Reducción del uso de la memoria para FIZZBUZZZ IN R  ( Reducing memory usage for fizzbuzz in r ) 
He estado intentando toda la noche para que mi Fuzzbuzz use por debajo de 20 MB de RAM, pero parece que no puedo obtenerlo mucho más pequeño que esto. Inde...

3  Acelerando para el bucle sobre una lista  ( Speeding up for loop over a list ) 
Tengo dos listas con ca. 4000 elementos donde cada elemento tienen dos columnas. Estos se están introduciendo en una función. Además de la función en la que s...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos