> ### 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