3 votos

Interpolación con distribuciones LogNormal en R

Quiero interpolar el conjunto de datos de abajo usando la distribución lognormal en R. Como puedes ver en los datos de abajo, tengo diferentes clases de tamaño de tierra (ha) y me gustaría interpolar los datos usando las clases de tamaño de tierra estándar que usaré para todos los países.

Estas son las clases de tamaño de terreno originales

Clases de tamaño (ha)

Superficie de las explotaciones

Menos de 0,8 ha

18012

0.8 - 1.6

66155

1.6 - 2.4

80224

2.4 - 3.2

61555

3.2 - 4.0

47754

4.0 - 6.0

56234

6,0 ha y más

38257

Total de participaciones

368191

Y los tamaños estándar de las tierras que quiero interpolar sus datos utilizando los datos anteriores (superficie de las explotaciones) se dan como:

clases de tamaño (ha)

0 - 1

1 - 2

2 - 3

3 - 4

4 - 5

5 - 10

He realizado este cálculo en Excel y me gustaría crear una función en R para hacerlo.

El código siguiente es la función que estoy tratando de crear.

install.packages("assertthat")
library(assertthat)
interpolation <- function(x, x1, y1,x2, y2) 
{
assert_that(is.numeric(x), 
isTRUE(all(is.finite(x))),
                       is.scalar(x1),
                      is.scalar(y1),
                      is.scalar(x2),
                     is.scalar(y2),
                    x1< x2)
meanlog <- mean(log(y2)
SDlog <- sd(log(y2)
output <- rep(NA_real_, length(x))
output[x <= x1] <- y1
output[x >= x2] <- y2
btwpoints <- which(is.na(output))
output[btwpoints] <- stats::approx(
    x = plnorm(c(x1, x2)),
   y = c(y1, y2),
  xoutput = plnorm(x[btwpoints]), method = 
"linear")$y
return(output)
}

He conseguido establecer las cuatro coordenadas (x1,x2,y1, y2) que representan las clases de tamaño inferior y superior. Estoy atascado en la configuración de la distribución lognormal en la función.

3voto

Jim Baldwin Puntos 427

Los comentarios le dan un enfoque para estimar un ajuste en forma de función de distribución acumulativa logarítmica normal. Sin embargo, si ese enfoque no produce un ajuste adecuado (que sospecho que podría estar en el ojo del espectador), entonces usted podría considerar el uso de splines cúbicos donde se puede restringir el ajuste a ser no decreciente. Aquí hay un enfoque de este tipo utilizando R.

# Set the size class boundaries and the associated areas
sizeClass <- c(0, 0.8, 1.6, 2.4, 3.2, 4, 6, 10)
area <- c(0, 18012, 66155, 80224, 61555, 47754, 56234, 38257)

# Fit the cumulative area with a cubic spline (restricted to be nondecreasing)
cumulativeArea <- cumsum(area)
splinefit <- spline(sizeClass, cumulativeArea, n=100, method="hyman")

# Plot the data and fit
par(mai=c(1,1,0.5,0.5))
plot(sizeClass, cumulativeArea, xlab="Land size (ha)", ylim=c(0,400000),
  ylab="Cumulative area of total holdings (ha)", font.lab=2, cex.lab=1.5, pch=16, axes=FALSE)
axis(1)
axis(2, c(0:4)*100000, c("0", "100,000", "200,000", "300,000", "400,000"))
box()
par(xpd=TRUE)
lines(splinefit)

Data and fit with cubic spline

Ahora construye las clases deseadas mediante interpolación:

standardClasses = c(1,2,3,4,5,10)  # Upper class boundaries
standardArea <- data.frame(UpperClassBoundary = standardClasses,
  Area = diff(spline(sizeClass, cumulativeArea, xout=c(0, standardClasses),
  method="hyman")$y))
stdClasses = c("0-1 ha", "1-2 ha", "2-3 ha", "3-4 ha", "4-5 ha", "5-10 ha")
rownames(standardArea) = stdClasses
standardArea

        UpperClassBoundary     Area
0-1 ha                   1 31294.37
1-2 ha                   2 93815.97
2-3 ha                   3 87095.09
3-4 ha                   4 61494.56
4-5 ha                   5 37803.50
5-10 ha                 10 56687.50

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X