Un par de ideas > ### xey: los datos > x

Anuncio
> ### Regresión No Paramétrica: Un par de ideas
>
>
>
>
### x e y: los datos
x <- c(1, 2, 4, 8)
y <- c(0.1, 0.3, 0.4, 0.5)
nx <- length(x)
> z <- seq(from=min(x), to = max(x), length = 100) ### valores en el rango de x
> nz <- length(z)
> k <- matrix(, nz, nx)
> k1 <- k
> b <- 1.5
### la ventana
> ### k, matriz nz*nx. Cada fila (asociada a z[j]) contiene el valor de los
> ### pesos normales correspondientes a cada observación
> for (i in 1:nx) { k[, i] <- dnorm(z, x[i], b) }
> sumk <- apply(k, 1, sum) ### sumk[j] suma de pesos en cada z[j]
> for( i in 1:nx) { k1[, i] <- (dnorm(z, x[i], b)*y[i]) / sumk }
> ### cada fila j de k1 (fila asociada a z[j]) contiene los pesos normalizados
> ### aplicados a la respuesta y de cada observación
> ### REGRESIÓN KERNEL NORMAL
> zk <- apply(k1, 1, sum)
> ### zk[j] es suma de pesos normalizados asociados a z[j] por las respuestas y
> ### zk[j] es el valor predicho de la respuesta en z[j]
> ### REGRESIÓN LOCAL con pesos normales
> yz <- c(1:length(z))*0
>
+
+
+
+
+
+
for (j in 1:length(z)) {
l <- lsfit(x, y, wt = k[j, ])$coef
### l contiene los coeficientes de una regresión lineal de y sobre x
### con los pesos normales de k asociados a z[j]
yz[j] <- l[1] + l[2]*z[j]
### yz[j] es el valor predicho de la respuesta en z[j]
}
1
>
>
+
>
>
x11()
plot(x, y, pch=19, cex=1.5, col="blue", ylim=c(0, 0.5), xlab="x", ylab="y",
main = "regresión no paramétrica")
points(x, c(1:nx)*0, pch=3, cex=1.5)
abline(lsfit(x, y)$coef, lty=2) ### recta de regresión
> for(i in 1:nx) { lines(z, k[, i]/2) } ### kernel normal
> lines(z, zk, lwd=2, col="blue")
> lines(z, yz, lwd=3, col="red")
### regresión kernel normal
### regresión local
> legend(min(x),max(y), legend=c("kernel normal","regresión local"),
+ cex=c(0.9,0.9), col=c("blue","red"), lwd=c(2,3), bty="n" )
la condición tiene longitud > 1 y sólo el primer elemento será usado
0.5
regresión no paramétrica
0.0
0.1
0.2
y
0.3
0.4
kernel normal
regresión local
1
2
3
4
5
6
7
8
x
2
> #### Aplicacion: Regresión de CATEDIFE sobre ORINDIFE ###
> ################# cafeína y catecolaminas ################
> odif <- c( 235, -90, 410, 117, 228, 254, 635, 325, -5, 230, 47,
+
75, -45, 555, -20, -5, 40 )
> cdif <- c( 3.52, 1.53, 2.35, 3.41, 5.75, 4.04, 6.87, 1.96,
+
0.98, 0.46, 1.56, 0.12, 2.86, 0.62, -0.82, -0.62, 1.53 )
87,
0.04,
> x <- odif ### diferencia en volumen de orina
> y <- cdif ### diferencia en catecolaminas
> #### función que dibuja las lineas de regresion anteriores #####
>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
regnopar.plot <- function(x, y, b) {
nx <- length(x)
z <- seq(from=min(x), to = max(x), length = 100) ### valores en el rango de x
nz <- length(z)
k <- matrix(, nz, nx)
k1 <- k
for (i in 1:nx) { k[, i] <- dnorm(z, x[i], b) }
sumk <- apply(k, 1, sum) ### sumk[j] suma de pesos en cada z[j]
for( i in 1:nx) { k1[, i] <- (dnorm(z, x[i], b)*y[i]) / sumk }
zk <- apply(k1, 1, sum)
yz <- c(1:length(z))*0
for (j in 1:length(z)) {
l <- lsfit(x, y, wt = k[j, ])$coef
yz[j] <- l[1] + l[2]*z[j]
}
plot(x, y, cex=1.5, lwd=2, col="blue", xlab="", ylab="", main="")
abline(lsfit(x, y)$coef)
lines(z, zk, lwd=2, col="blue")
lines(z, yz, lwd=3, col="red")
legend(min(x),max(y), legend=c("kernel normal","regresión local"),
cex=c(0.9,0.9), col=c("blue","red"), lwd=c(2,3), bty="n" )
}
> x11()
> regnopar.plot(x, y, b=50)
> title(main="ventana b = 50", xlab="odif", ylab="catedif")
> x11()
> regnopar.plot(x, y, b=150)
> title(main="ventana b = 150", xlab="odif", ylab="catedif")
> # ajuste mediante kernel normal con ksmooth
> # x11(); plot(x,y)
> # lines( ksmooth(x, y, "normal", bandwidth=150) )
3
ventana b = 50
0
2
catedif
4
6
kernel normal
regresión local
0
200
400
600
400
600
odif
ventana b = 150
0
2
catedif
4
6
kernel normal
regresión local
0
200
odif
4
>
>
>
+
+
>
>
+
+
+
h <- c(0.5, 1, 1.5, 2) #### varios valores de la ventana
y <- matrix(, length(z), n*length(h))
for(j in 1:(length(h))) {
for(i in 1:n){
y[, (j-1)*n+i] <- dnorm(z, x[i], h[j])}}
fx <- matrix(, length(z), length(h))
for(j in 1:length(h)){
for(i in 1:length(z)){
fx[i, j] <- sum( y[i, ((j-1)*n+1):(j*n)] )
} }
>
>
>
>
+
+
+
+
+
+
x11()
par(mfrow = c(2, 2), pty = "s")
par(mar=c(2, 2, 1, 1) + 0.1)
for(i in 1:length(h)){
y <- matrix(, length(z), n)
for(j in 1:n) {y[, j] <- dnorm(z, x[j], h[i])}
matplot(z, cbind(fx[, i], y*0.5), type="l", lty=1, col=1, ylim=c(0, 1),
xlab="", ylab="")
points(x, rep(0, length(x)), pch=3)
}
0.8
0.6
0.4
0.2
0.0
0.0
0.2
0.4
0.6
0.8
1.0
### Ajuste de una densidad mediante kernel normal
x <- c(1,2,4,8) ### los datos
n <- length(x)
z <- seq(-2,11,0.1)
1.0
>
>
>
>
2
4
6
8
10
-2
0
2
4
6
8
10
-2
0
2
4
6
8
10
-2
0
2
4
6
8
10
0.8
0.6
0.4
0.2
0.0
0.0
0.2
0.4
0.6
0.8
1.0
0
1.0
-2
5
>
>
+
>
>
>
>
>
+
>
### Aplicación: Densidad No Paramétrica para odif
odif <- c(235, -90, 410, 117, 228, 254, 635, 325, -5, 230, 47, 87,
75, -45, 555, -20, -5, 40)
n <- length(odif)
z <- seq(min(odif)-200, max(odif)+200, 1)
y <- matrix(, length(z), n)
h <- 100
for(i in 1:n){
y[, i] <- dnorm(z, odif[i], h) }
dodif <- apply(y, 1, sum)/n
>
>
>
>
>
x11()
plot(z, dodif, xlim = c(-200, 700), type="l", col="blue", lwd=3, xlab="odif")
lines(z, dnorm(z, mean(odif), sqrt(var(odif))))
points(odif, rep(0,n), pch=3)
abline(0, 0)
0.0010
0.0005
0.0000
dodif
0.0015
0.0020
> ### uso de la función density
> ## x11()
> ## plot(density(odif, window="g", width=400), type="l")
-200
0
200
400
600
odif
6
Descargar