beta regression with optim in R

127 Views Asked by At

I am trying to estimate parameters in a beta regression using optim in R. I can do so if I parameterize the model with mu and phi as is done in the package betareg. That optim code is shown below. However, I cannot estimate alpha and beta directly with optim. I have tried maybe a half-doze variations of the code at the bottom. I suspect this is more of a coding issue than a statistical issue, but can move this to Cross Validated if requested.

First I create simulated data with 1000 samples of the proportion my.survival in each of 2 years. I model my.survival as a function of year:

set.seed(1234)

# create data
year     <-  1:2
years    <- length(year)  # number of years
n.trials <-  1000         # samples per year

# define parameters in linear predictor
B0       <-  0.7
B1       <- -0.05

# obtain mu and phi
my.means <- exp(B0 + B1 * year) / (1 + exp(B0 + B1 * year))
my.means

my.phi <- 100

# convert mu and phi into annual alpha and beta
ab.fun <- function(mu, phi)
{
  a <- mu * phi
  b <- phi - mu * phi
  ab <- data.frame(a, b)
  return(ab)
}

alphabeta <- ab.fun(my.means, my.phi)
alphabeta
#          a        b
# 1 65.70105 34.29895
# 2 64.56563 35.43437

my.alpha <- alphabeta$a
my.beta  <- alphabeta$b

# obtain random samples of annual proportion surviving
my.survival <- rep(NA, (years*n.trials))
my.year     <- rep(NA, (years*n.trials))

iter <- 1

for(i in 1:years) {
     for(j in 1:n.trials) {
          my.survival[iter] <- rbeta(1, my.alpha[i], my.beta[i])
          my.year[iter] <- i
          iter <- iter + 1
     }
}

head(my.survival)
head(my.year)

Then I estimate the parameters with the betareg package:

library(betareg)

gy <- betareg(my.survival ~ my.year)
summary(gy)
# Call:
# betareg(formula = my.survival ~ my.year)
# 
# Standardized weighted residuals 2:
#     Min      1Q  Median      3Q     Max 
# -3.4235 -0.6520 -0.0099  0.6561  3.5155 
# 
# Coefficients (mean model with logit link):
#              Estimate Std. Error z value Pr(>|z|)    
# (Intercept)  0.721712   0.014738   48.97  < 2e-16 ***
# my.year     -0.067093   0.009293   -7.22 5.19e-13 ***
# 
# Phi coefficients (precision model with identity link):
#       Estimate Std. Error z value Pr(>|z|)    
# (phi)   100.69       3.17   31.77   <2e-16 ***
# ---
# Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 
# 
# Type of estimator: ML (maximum likelihood)
# Log-likelihood:  3268 on 3 Df
# Pseudo R-squared: 0.02544
# Number of iterations: 8 (BFGS) + 2 (Fisher scoring) 
# Warning message:
# In deparse(x$call, width.cutoff = floor(getOption("width") * 0.85)) :
#   invalid 'cutoff' value for 'deparse', using default

I obtain virtually the same estimates of B0, B1 and phi with optim:

# estimate parameters with optim
beta.reg = function(betas, my.survival, my.year){

     phi   = betas[1]
     B0    = betas[2]
     B1    = betas[3]

     n <- length(my.survival)
     llh <- rep(0, n)

     for(i in 1:n){

          mu <- exp(B0 + B1 * my.year[i]) / (1 + exp(B0 + B1 * my.year[i]))

          alpha <- mu * phi
          beta  <- phi - mu * phi

          llh[i] = llh[i] + dbeta(my.survival[i], alpha, beta, log = TRUE)
     }

     -sum(llh)
}

alpha.init <- 2
beta.init  <- 2
phi.init   <- 25
B0.init    <- 0
B1.init    <- 0

my.model <- optim(c(phi.init, B0.init, B1.init), 
                 beta.reg, my.survival = my.survival, my.year = my.year, method = "BFGS", hessian=TRUE)


my.model$par
#[1] 100.71561736   0.72166040  -0.06705041

my.model$value
#[1] -3268.381

covmat <- solve(my.model$hessian)

mySE <- diag(covmat)^0.5
mySE
#[1] 3.170301989 0.014736516 0.009291484

However, I cannot estimate the annual alpha's and beta's with optim. I have tried several variations of the code below. In the version of the code below I simplied the formulae of mu by hardcoding the values of year. I know I can derive alpha and beta from the estimates of mu and phi from the optim code above and use the delta method to obtain SE's. However, I thought it would be more convenient and ultimately useful to estimate alpha and beta directly with optim if possible.

I wonder whether the issue is optim does not allow derived parameters and below alpha and beta are derived from phi, B0 and B1?

# estimate parameters with optim
beta.reg = function(betas, my.survival, my.year){

     B0           = betas[1]
     B1           = betas[2]
     alpha1       = betas[3]
     alpha2       = betas[4]
     beta1        = betas[5]
     beta2        = betas[6]
     phi          = betas[7]

     n <- length(my.survival)
     llh <- rep(0, n)

     # here I try to simplify by hardcoding the values of year to 1:2
     mu1  <- exp(B0 + B1 * 1)  / (1 + exp(B0 + B1 * 1))
     mu2  <- exp(B0 + B1 * 2)  / (1 + exp(B0 + B1 * 2))

     alpha1   = mu1 * phi
     beta1    = phi - mu1 * phi
     alpha2   = mu2 * phi
     beta2    = phi - mu2 * phi

     iter <- 1

     for(i in 1:years){
          for(i in 1:n.trials){
               if(i ==  1) llh[iter] = llh[iter] + dbeta(my.survival[iter], alpha1, beta1, log = TRUE)
               if(i ==  2) llh[iter] = llh[iter] + dbeta(my.survival[iter], alpha2, beta2, log = TRUE)
               iter <- iter + 1
          }
     }
     -sum(llh)
}

B0.init    <- 0
B1.init    <- 0
alpha.init <- rep(2, years)
beta.init  <- rep(2, years)
phi.iter   <- 100

my.model <- optim(c(B0.init, B1.init, alpha.init, beta.init, phi.iter), 
                 beta.reg, my.survival = my.survival, my.year = my.year, method = "BFGS", hessian=TRUE)


my.model$par
#[1]   1.0013198  -0.2096154   2.0000000   2.0000000   2.0000000   2.0000000 338.7167214

my.model$value
#[1] -9.090913

covmat <- solve(my.model$hessian)
# Error in solve.default(my.model$hessian) : 
#  Lapack routine dgesv: system is exactly singular: U[3,3] = 0

mySE <- diag(covmat)^0.5
mySE
1

There are 1 best solutions below

0
Mark Miller On

I have not been able to estimate alpha and beta from a beta regression with optim. So, I resort here to using a Bayesian model with JAGS. In this answer I return to using 10 years of data instead of just two. I first use betareg then JAGS. At the bottom of this post I work through the delta method to estimate the 95% CI of alpha and beta with betareg.

The Bayesian point estimates of alpha and beta are pretty close to the true values. The estimated 95% CI from betareg also are close to the estimated 95% credible intervals returned by JAGS for the two years I checked: Years 2 and 10.

I remain interested in how to get estimates of alpha and beta from optim. Note that in this post I obtain the 95%CI of alpha and beta separately. I do not know whether it is better to somehow estimate their 95%CI together.

First I create some fake data:

set.seed(1234)

# create data
year     <-  1:10
years    <- length(year)  # number of years
n.trials <-  200          # samples per year

# define parameters in linear predictor
B0       <-  0.7
B1       <- -0.05

# obtain mu and phi
my.means <- exp(B0 + B1 * year) / (1 + exp(B0 + B1 * year))
my.means
#[1] 0.6570105 0.6456563 0.6341356 0.6224593 0.6106392 0.5986877 0.5866176 0.5744425 0.5621765 0.5498340

my.phi <- 100

# convert mu and phi into annual alpha and beta
ab.fun <- function(mu, phi)
{
  a <- mu * phi
  b <- phi - mu * phi
  ab <- data.frame(a, b)
  return(ab)
}

annual_ab <- ab.fun(my.means, my.phi)
annual_ab
#           a        b
# 1  65.70105 34.29895
# 2  64.56563 35.43437
# 3  63.41356 36.58644
# 4  62.24593 37.75407
# 5  61.06392 38.93608
# 6  59.86877 40.13123
# 7  58.66176 41.33824
# 8  57.44425 42.55575
# 9  56.21765 43.78235
# 10 54.98340 45.01660

annual_a <- annual_ab$a
annual_b <- annual_ab$b

# obtain random samples of annual proportion surviving
mysurvival <- rep(NA, (years*n.trials))
myyear     <- rep(NA, (years*n.trials))

iter <- 1

for(i in 1:years) {
     for(j in 1:n.trials) {
          mysurvival[iter] <- rbeta(1, annual_a[i], annual_b[i])
          myyear[iter] <- i
          iter <- iter + 1
     }
}

head(mysurvival)
head(myyear)

Then I use betareg to get point estimates of annual alpha and beta. Their 95%CI are obtained at the very bottom of this post:

library(betareg)

gy <- betareg(mysurvival ~ myyear)
summary(gy)
# Call:
# betareg(formula = mysurvival ~ myyear)
# 
# Standardized weighted residuals 2:
#     Min      1Q  Median      3Q     Max 
# -3.4040 -0.6563 -0.0025  0.6510  3.4856 
# 
# Coefficients (mean model with logit link):
#              Estimate Std. Error z value Pr(>|z|)    
# (Intercept)  0.708469   0.009939   71.28   <2e-16 ***
# myyear      -0.052086   0.001583  -32.91   <2e-16 ***
# 
# Phi coefficients (precision model with identity link):
#       Estimate Std. Error z value Pr(>|z|)    
# (phi)   101.03       3.18   31.77   <2e-16 ***
# ---
# Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 
# 
# Type of estimator: ML (maximum likelihood)
# Log-likelihood:  3225 on 3 Df
# Pseudo R-squared: 0.3521
# Number of iterations: 15 (BFGS) + 2 (Fisher scoring) 
# Warning message:
# In deparse(x$call, width.cutoff = floor(getOption("width") * 0.85)) :
#   invalid 'cutoff' value for 'deparse', using default

gy$coefficients$mean
# (Intercept)      myyear 
#  0.70846905 -0.05208558 

gy$coefficients$precision
#    (phi) 
# 101.0334 

beta.reg.means <-      exp(as.numeric(gy$coefficients$mean[1]) + as.numeric(gy$coefficients$mean[2]) * year)  / 
                  (1 + exp(as.numeric(gy$coefficients$mean[1]) + as.numeric(gy$coefficients$mean[2]) * year))
beta.reg.means
#[1] 0.6584475 0.6466390 0.6346487 0.6224891 0.6101734 0.5977156 0.5851303 0.5724329 0.5596394 0.5467662

beta.reg.phi <- as.numeric(gy$coefficients$precision)
beta.reg.phi
#[1] 101.0334

beta.reg.beta <- beta.reg.phi - (beta.reg.means * beta.reg.phi)
beta.reg.beta
#[1] 34.50822 35.70128 36.91270 38.14122 39.38552 40.64418 41.91571 43.19857 44.49114 45.79177

beta.reg.alpha <- beta.reg.phi - beta.reg.beta
beta.reg.alpha
#[1] 66.52521 65.33216 64.12074 62.89221 61.64791 60.38926 59.11772 57.83487 56.54229 55.24167

Here is the JAGS code. Extracting the estimates of alpha and beta for each year is a little cumbersome. My answer is based on the two posts below:

https://stats.stackexchange.com/questions/230106/error-in-jags-beta-regression-model-r-value-out-of-range-in-gammafn

https://stats.stackexchange.com/questions/41536/how-can-i-model-a-proportion-with-bugs-jags-stan

## Basic MDAM ##
# JAGS model to estimate parameters
sink("Bayesian_JAGS_beta_regression_model_Sept7_2023.txt")

cat("

     model {

     for (i in 1:n.obs){

          mysurvival[i] ~ dbeta(alpha[i], beta[i])

          alpha[i] <- mu[i] * phi

          beta[i]  <- (1 - mu[i]) * phi

          logit(mu[i]) <- B0 + B1 * myyear[i]

     }

     # priors
     B0  ~ dnorm(0, .0001)
     B1  ~ dnorm(0, .0001)
     # phi ~ dgamma(50, 50)
     phi ~ dgamma(0.001, 0.001)

     # End model statement
     }

", fill = TRUE)

sink()

# Format JAGS data
data <- list(mysurvival  = mysurvival,
             myyear      = myyear,
             n.obs       = length(mysurvival))

require(R2jags)

# Set initial values
my.inits <- function(){list(B0 = rnorm(1), B1 = rnorm(1), phi = rgamma(1,0.1,0.1))}

# Define parameters for the MDAM to track (parms)
parms <- c("B0", "B1", "phi", "alpha", "beta", "mu")

# Save JAGS output (out) and specify initial values, parameters to track, model to run, number
# of chains to run, number of iterations to run, burn-in period, and thinning
out <- jags.parallel(data = data, inits = list(my.inits()), 
       parms, "Bayesian_JAGS_beta_regression_model_Sept7_2023.txt", 3, 10000, 2000, 1)

MDAMoutput <- list(out)

sink("Bayesian_JAGS_beta_regression_model_Sept7_2023_output.txt")
sink()

my.rownames <- dimnames(MDAMoutput[[1]]$BUGSoutput$summary)[[1]]

MDAMoutput[[1]]$BUGSoutput$summary[grep("B0", my.rownames, value = TRUE),]
#         mean           sd         2.5%          25%          50%          75%        97.5%         Rhat        n.eff 
# 7.086974e-01 9.953235e-03 6.892067e-01 7.021333e-01 7.086630e-01 7.153687e-01 7.284029e-01 1.002028e+00 1.800000e+03 

MDAMoutput[[1]]$BUGSoutput$summary[grep("B1", my.rownames, value = TRUE),]
#          mean            sd          2.5%           25%           50%           75%         97.5%          Rhat         n.eff 
# -5.211990e-02  1.584619e-03 -5.522544e-02 -5.318531e-02 -5.212974e-02 -5.107140e-02 -4.896569e-02  1.002105e+00  1.700000e+03

MDAMoutput[[1]]$BUGSoutput$summary[grep("mu", my.rownames, value = TRUE),][c((n.trials *  0 + 1),
                                                                             (n.trials *  1 + 1),
                                                                             (n.trials *  2 + 1),
                                                                             (n.trials *  3 + 1),
                                                                             (n.trials *  4 + 1),
                                                                             (n.trials *  5 + 1),
                                                                             (n.trials *  6 + 1),
                                                                             (n.trials *  7 + 1),
                                                                             (n.trials *  8 + 1),
                                                                             (n.trials *  9 + 1)),]
#               mean          sd      2.5%       25%       50%       75%     97.5%     Rhat n.eff
# mu[1]    0.6584885 0.001928283 0.6547221 0.6572157 0.6584955 0.6597798 0.6622873 1.001967  1900
# mu[201]  0.6466737 0.001663520 0.6434101 0.6455647 0.6466801 0.6477904 0.6499526 1.001859  2200
# mu[401]  0.6346766 0.001420069 0.6318995 0.6337218 0.6346857 0.6356291 0.6374769 1.001681  2700
# mu[601]  0.6225097 0.001221884 0.6201236 0.6216908 0.6225092 0.6233352 0.6248938 1.001410  4200
# mu[801]  0.6101863 0.001105074 0.6080184 0.6094395 0.6101734 0.6109392 0.6123336 1.001099 12000
# mu[1001] 0.5977204 0.001105921 0.5955577 0.5969720 0.5977159 0.5984645 0.5998813 1.000940 24000
# mu[1201] 0.5851269 0.001231734 0.5827273 0.5842927 0.5851155 0.5859525 0.5875464 1.001034 20000
# mu[1401] 0.5724210 0.001455394 0.5695773 0.5714415 0.5724168 0.5734044 0.5752915 1.001242  6500
# mu[1601] 0.5596188 0.001742523 0.5561964 0.5584431 0.5596110 0.5607916 0.5630853 1.001436  4000
# mu[1801] 0.5467369 0.002068185 0.5426668 0.5453487 0.5467295 0.5481170 0.5508491 1.001583  3100

MDAMoutput[[1]]$BUGSoutput$summary[grep("phi", my.rownames, value = TRUE),]
#        mean           sd         2.5%          25%          50%          75%        97.5%         Rhat        n.eff 
#  100.905288     3.138801    94.845041    98.779443   100.882878   102.997820   107.023605     1.001087 13000.000000

MDAMoutput[[1]]$BUGSoutput$summary[grep("alpha", my.rownames, value = TRUE),][c((n.trials *  0 + 1),
                                                                                (n.trials *  1 + 1),
                                                                                (n.trials *  2 + 1),
                                                                                (n.trials *  3 + 1),
                                                                                (n.trials *  4 + 1),
                                                                                (n.trials *  5 + 1),
                                                                                (n.trials *  6 + 1),
                                                                                (n.trials *  7 + 1),
                                                                                (n.trials *  8 + 1),
                                                                                (n.trials *  9 + 1)),]
#                 mean       sd     2.5%      25%      50%      75%    97.5%     Rhat n.eff
# alpha[1]    66.44510 2.079978 62.44778 65.03956 66.42711 67.83460 70.53846 1.001089 13000
# alpha[201]  65.25292 2.040661 61.33469 63.87415 65.23284 66.61772 69.25259 1.001087 13000
# alpha[401]  64.04235 2.001192 60.20275 62.68730 64.02398 65.37771 67.95775 1.001085 13000
# alpha[601]  62.81465 1.961704 59.04585 61.49011 62.79779 64.12377 66.65097 1.001084 14000
# alpha[801]  61.57115 1.922335 57.87857 60.27480 61.55274 62.85493 65.31905 1.001083 14000
# alpha[1001] 60.31327 1.883225 56.69504 59.04248 60.29612 61.57195 63.99183 1.001083 14000
# alpha[1201] 59.04251 1.844517 55.49438 57.79441 59.02404 60.27848 62.64403 1.001084 14000
# alpha[1401] 57.76042 1.806354 54.29256 56.53967 57.73558 58.97222 61.29947 1.001085 13000
# alpha[1601] 56.46861 1.768875 53.06965 55.27303 56.44399 57.65809 59.93936 1.001088 13000
# alpha[1801] 55.16875 1.732213 51.84010 53.99783 55.14170 56.33966 58.56986 1.001092 13000

MDAMoutput[[1]]$BUGSoutput$summary[grep("beta", my.rownames, value = TRUE),][c((n.trials *  0 + 1),
                                                                               (n.trials *  1 + 1),
                                                                               (n.trials *  2 + 1),
                                                                               (n.trials *  3 + 1),
                                                                               (n.trials *  4 + 1),
                                                                               (n.trials *  5 + 1),
                                                                               (n.trials *  6 + 1),
                                                                               (n.trials *  7 + 1),
                                                                               (n.trials *  8 + 1),
                                                                               (n.trials *  9 + 1)),]
#                mean       sd     2.5%      25%      50%      75%    97.5%     Rhat n.eff
# beta[1]    34.46019 1.085491 32.36255 33.72983 34.44733 35.18916 36.58594 1.001124 11000
# beta[201]  35.65237 1.117705 33.49936 34.90057 35.63899 36.40162 37.83889 1.001113 11000
# beta[401]  36.86294 1.151674 34.64941 36.08722 36.85266 37.63623 39.11822 1.001104 12000
# beta[601]  38.09064 1.187376 35.80721 37.28706 38.08057 38.88468 40.41726 1.001097 12000
# beta[801]  39.33414 1.224773 36.96737 38.50773 39.32685 40.15163 41.72812 1.001093 13000
# beta[1001] 40.59202 1.263803 38.14988 39.73973 40.58855 41.43106 43.06804 1.001091 13000
# beta[1201] 41.86278 1.304388 39.33971 40.98025 41.85991 42.72886 44.40636 1.001090 13000
# beta[1401] 43.14487 1.346429 40.54912 42.23307 43.14327 44.03663 45.78428 1.001092 13000
# beta[1601] 44.43668 1.389814 41.75596 43.49734 44.43168 45.35698 47.16163 1.001095 13000
# beta[1801] 45.73653 1.434414 42.97110 44.77119 45.73217 46.68811 48.54146 1.001099 12000

MDAMoutput[[1]]$BUGSoutput$summary[grep("deviance", my.rownames, value = TRUE),]
#         mean           sd         2.5%          25%          50%          75%        97.5%         Rhat        n.eff 
# -6446.535072     2.429548 -6449.311780 -6448.319688 -6447.165761 -6445.413433 -6440.172403     1.002023  1800.000000

EDIT - September 8, 2023

Below I work through the delta method to obtain the 95%CI of alpha and beta from betareg. Then I compare those estimates with the 95% credible interval estimates returned by my JAGS code. Both approaches return similar estimates. I only show the results for Year 2. Results for any year from 1 - 10 can be obtained by changing year = 2 to the desired year. I have only checked estimates for years 2 and 10.

B0    = 0.70846905
B1    = -0.05208558
phi   = 101.0334 
year  = 2
mu    = exp(B0 + B1 * year) / (1 + exp(B0 + B1 * year))
alpha = mu * phi
beta  = (1 - mu) * phi
zcrit = qnorm(.975)

#                            B0             B1             phi
my.vcv <- matrix(c(9.878412e-05, -1.399495e-05,  7.484683e-04,
                  -1.399495e-05,  2.504559e-06, -5.671391e-05,
                   7.484683e-04, -5.671391e-05,  1.011129e+01),
          ncol = 3, nrow = 3, byrow = TRUE)
my.vcv

# alpha = mu * phi
#
# partial derivative of alpha with respect to B0
pd.alpha.B0  <- (       phi * exp(B0 + B1 * year)) / ((1 + exp(B0 + B1 * year))^2)

# partial derivative of alpha with respect to B1
pd.alpha.B1  <- (year * phi * exp(B0 + B1 * year)) / ((1 + exp(B0 + B1 * year))^2)

# partial derivative of alpha with respect to phi is: mu
pd.alpha.phi <-               exp(B0 + B1 * year)  /  (1 + exp(B0 + B1 * year))


# For beta = (1 - mu) * phi
#
# partial derivative of beta with respect to B0
pd.beta.B0  <- (-1 *        phi * exp(B0 + B1 * year)) / ((1 + exp(B0 + B1 * year))^2)

# partial derivative of beta with respect to B1
pd.beta.B1  <- (-1 * year * phi * exp(B0 + B1 * year)) / ((1 + exp(B0 + B1 * year))^2)

# partial derivative of beta with respect to phi is: 1 - mu
pd.beta.phi <-  1 -               exp(B0 + B1 * year)  / (1 + exp(B0 + B1 * year))


Alpha.pd <- matrix(c(pd.alpha.B0, pd.alpha.B1, pd.alpha.phi), nrow = 1)
Alpha.pd

alpha.var.1 <- Alpha.pd %*% my.vcv
alpha.var   <- alpha.var.1 %*% t(Alpha.pd)
alpha.var

alpha.SE <- alpha.var^0.5
alpha.SE

# 'The standard error is most useful as a means of calculating a confidence interval.
# For a large sample, a 95% confidence interval is obtained
# as the values 1.96×SE either side of the mean.'
# Douglas G Altman and J Martin Bland 2005
alpha.u95ci  = alpha + alpha.SE * zcrit
alpha.u95ci
 
alpha.l95ci  = alpha - alpha.SE * zcrit
alpha.l95ci


Beta.pd <- matrix(c(pd.beta.B0, pd.beta.B1, pd.beta.phi), nrow = 1)
Beta.pd

beta.var.1 <- Beta.pd %*% my.vcv
beta.var   <- beta.var.1 %*% t(Beta.pd)
beta.var

beta.SE <- beta.var^0.5
beta.SE

# 'The standard error is most useful as a means of calculating a confidence interval.
# For a large sample, a 95% confidence interval is obtained
# as the values 1.96×SE either side of the mean.'
# Douglas G Altman and J Martin Bland 2005
beta.u95ci  = beta + beta.SE * zcrit
beta.u95ci

beta.l95ci  = beta - beta.SE * zcrit
beta.l95ci


# For year 2
c(alpha, alpha.SE, alpha.l95ci, alpha.u95ci)
#[1] 65.332135  2.067623 61.279667 69.384602

c(beta, beta.SE, beta.l95ci, beta.u95ci)
#[1] 35.701265  1.131516 33.483536 37.918995


# From JAGS for year 2
#                 mean       sd     2.5%      25%      50%      75%    97.5%     Rhat n.eff
# alpha[201]  65.25292 2.040661 61.33469 63.87415 65.23284 66.61772 69.25259 1.001087 13000
# beta[201]   35.65237 1.117705 33.49936 34.90057 35.63899 36.40162 37.83889 1.001113 11000