• No se han encontrado resultados

Ajuste de una recta mediante cuadrados m´ınimos

In document Universidad Nacional Autónoma de México (página 129-146)

Con todas las herramientas que ya se estudiaron, ahora es posible estudiar una aplicaci´on.

Si bien casi todos los programas actuales permiten efectuar c´alculos con el m´etodo de los cuadrados m´ınimos, son pocos los que efect´uan los c´alculos consi- derando las incertidumbres en los datos. Todos los programas pueden presentar gr´aficamente las incertidumbres o barras de error, pero pocos las incluyen en los c´alculos.

La diferencia que resulta al hacer el ajuste por cuadrados m´ınimos tomando en cuenta o no las incertidumbres se puede observar al calcuoar el coeficiente de regresi´on, que siempre es m´as cercano a 1 cuando se consideran las incerti- dumbres en los datos que en el caso contrario.

As´ı, consideremos el siguiente conjunto de mediciones de dos variables que llamaremos x y y y sus respectivas incertidumbres ux y uy.

Los datos que se usar´an son los siguientes: x <- c(5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47) y <- c(88.12, 94.05, 97.45, 100.32, 103.09, 103.15, 109.32, 112.34, 115.32, 118.47, 121.24, 124.43, 127.43, 132.00, 133.47) y sus incertidumbres ux <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) uy <- c(1, 1.2, 1.8, 0.9, 0.7, 0.6, 1.2, 0.8, 0.6, 1.5, 0.8, 0.9, 1.5, 1.8, 0.9)

Estos datos y sus incertidumbres se almacenar´an en una estructura data.frame como sigue:

> datos <- data.frame(x, y, ux, uy)

Entonces, empezaremos a hacer el ajuste por cuadrados m´ınimos definiendo algunas operaciones y almacen´andolas en variables.

N <- length(x); alfa <- 0.05 df <- N-2 mx <- mean(x) my <- mean(y) Sx <- sum(x/uy^2) Sy <- sum(y/uy^2) Sxy <- sum(x*y/uy^2) Sx2 <- sum(x^2/uy^2) Su <- sum(1/uy^2)

Como puede verse, lo primero es determinar el n´umero, N , de parejas de datos de las variables independiente, x, y dependiente y. Com haremos un trabajo completo, tambi´en definimos el n´umero de grados de libertad, df necesario al establecer la banda de confianza. Luego, pueden verse la sumas (con incerti- dumbres) necesarias en la construccion de la matriz cuyo determinante se usar´a para efectuar los c´alculos por cuadrados m´ınimos.

de t´erminos independientes y se resuelve el sistema. N´otese que el resultado de c´ada c´alculo siempre se almacena en una variable:

> matriz1 <- matrix(c(Sx2, Sx, Sx, Su), nrow=2, ncol=2) > matriz2 <- matrix(c(Sxy, Sy), nrow=2, ncol=1)

> solucion <- solve(matriz1, matriz2)

La pendiente y la ordenada al origen se definen como:

> m <- solucion[1] > b <- solucion[2]

que son elementos de solucion.

Las incertidumbres en los par´ametros:

> ub<-sqrt(Sx2/abs(det(matriz1))) > um<-sqrt(Su/abs(det(matriz1)))

> fit <- function(z) m*z+b

A continuaci´on se calcula el coeficiente de regresi´on, R, el error est´andar, std err, el valor de intervalo de confianza, CI, y la funci´on para establecer la banda de confianza, conf y

> R <-1-sum((y/uy^2-fit(x)/uy^2)^2)/sum((y/uy^2-mean(y/uy^2))^2) > std_err <- sqrt(sum((y-my)^2)/df)

> CI <- qt(1-alfa, df)

> confy <- function(z) CI*std_err*sqrt(1/N + (z-mx)^2/(sum((x-mx)^2)))

Ahora se construir´an las funciones que formar´an la frontera de la banda de confianza:

> y1 <- function(x) m*x+b+confy(x) > y2 <- function(x) m*x+b-confy(x)

Ya con los resultados num´ericos listos procederemos a trazar los gr´aficos, primero el marco para los datos experimentales:

> par(mar=c(2,2,1,1))

> plot(x, y, type="n", axes=FALSE, panel.first = grid(lty=4,lwd=1,col="orange")) > box(col=4)

> axis(side = 1, tck = .01, labels = NA, col=4) > axis(side = 2, tck = .01, labels = NA, col=4) > axis(side = 1, lwd = 0, line = -0.9, col=4)

> axis(side = 2, lwd = 0, line = -0.9, las = 1, col=4) > mtext(side = 1, "x", line = 1)

> mtext(side = 2, "y", line = 1.2)

Ahora los datos experimentales con sus barras de incertidumbre y la recta ajustada:

> points(x,y, pch=19, cex=0.5)

> arrows(x,y,x+ux,y, col=’blue’, length=0.02, angle=90) > arrows(x,y,x-ux,y, col=’blue’, length=0.02, angle=90) > arrows(x, y, x, y+uy, col=’blue’, length=0.02, angle=90) > arrows(x, y, x, y-uy, col=’blue’, length=0.02, angle=90) > z <- seq(0.9*min(x), 1.1*max(x), length.out=99)

Ahora se trazar´a la banda de confianza:

> xpol <- c(z,rev(z))

> ypol <- c(y1(z), rev(y2(z)))

> polygon(xpol, ypol, col="#FFAAff90", border="white")

N´otese que se han insertado nuevas funciones que no hab´ıamos considerado hasta ahora, a saber rev y polygon . Tambi´en se ha incluido una forma diferente para definir un color (el de la banda de confianza). En este caso el color est´a definido por #FFAAff y la transparencia como 90, con el fin de que la mancha de color debida a la funci´on polygon “deje ver” los gr´aficos que, de otro modo, quedar´ıan ocultos a la vista.

Ahora se insertar´an los textos siguientes:

pp <- paste("y(x)=", format(m, digits=2, nsmall=4), " *x + (", format(b, digits=2, nsmall=4),")")

pp2 <- paste("Um=", format(um, digits=2, nsmall=4), ", Ub=", format(ub, digits=2, nsmall=4))

pp3 <- paste("R^2=", format (R,digits=2,nsmall=4)) legend(min(x), max(y), pp, cex=0.8, bty="n") legend(min(x), max(y)*0.95, pp2, cex=0.8, bty="n") legend(min(x), max(y)*0.9, pp3, cex=0.8, bty="n")

No se profundizar´a en describir las nuevas funciones insertadas, b´astele al lector con conocer su uso, por ahora. Si requiere de mayor informaci´on solicite la ayuda al programa, usando, por ejemplo, help(legend).

Y para completar el trabajo, debe trazarse el gr´afico de residuos.

> windows(xpos=10, ypos=10)

> plot(x,fit(x)/y, type="b", main="Residuos", xlab="x", ylab="", col="blue", panel.first = grid (lty=4,lwd=1,col="orange")) > segments(0,1,max(x),1, col="black", lwd=2)

Gr´aficos en 3D

Con ejercicios se observar´an gr´aficos 3D de potenciales electrost´aticos debidos a la presencia de una o m´as part´ıculas en el espacio.

Antes de trazar un gr´afico en 3D se requiere de un package, a saber rgl que se obtiene de internet.

As´ı, com oprimer ejercicio se propone:

> library(rgl) > f <- function(x,y) {2/sqrt((x-1)^2+(y+1)^2) - 2/sqrt((x+1)^2+(y-1)^2)} > open3d() wgl 1

> plot3d(f, col = colorRampPalette(c("blue", "white", "yellow")), xlab = "X", ylab = "Y", zlab = "Potencial",

xlim = c(-3,3), ylim = c(-3,3), zlim=c(-10,10), aspect=c(1, 1, 1.5))

En la figura 52 se observa el resultado

Lo que se observa es nua imagen est´atica, sin embargo, usando el rat´on y pulsando el bot´on izquierdo del mismo es posible hacer rotaciones de la imagen en diferentes direcciones.

En el caso de usar Windows, la rueda con la que cuenta el rat´on permite hacer acercamientos o alejamientos de las im´agenes sin detrimento de su calidad.

El almacenamiento de este tipo de im´agenes puede hacerse mediante captura de pantallas o ventanas.

A continuaci´on se propone otro ejercicio:

> plot3d(f, col = colorRampPalette(c("red", "green", "blue")), xlab = "", ylab = "", zlab = "",

xlim = c(-3,3), ylim = c(-3,3), zlim=c(-10,10), aspect=c(1, 1, 1.5), box=FALSE, axes=FALSE) >

En la figura 51 se observa el resultado despu´es de rotar la imagen.

El trazo de superficies aunque muy atractivo visualmente es tan s´olo uno de los ejemplos del trazo de gr´aficos 3D.

En los experimentos de laboratorio lo que se tiene son datos puntuales. Si bien el programa puede representar “puntos”, la opci´on s (s= sphere) permite usar esferas para representar a los puntos, como se muestra a continuaci´on.

Recordando que en todo gr´afico de R es posibleasignar una gran variedad de colores, a continuaci´on se ver´a en el ejercicio el resultado de lo anterior.

> library(rgl) > t<-seq(0,6*pi,0.35) > x<-cos(t) > y<-sin(t) > z<-0.7*t > plot3d(x,y,z,col=rainbow(10),type="s",radius=0.6)

Cuando se estudiaron los gr´aficos de dispersi´on en dos dimensiones, result´o interesante la posibilidad de insertar m´as elementos gr´aficos en una misma ven- tana, pues a veces es necesario completar el gr´afico con informaci´on adicional a la que permite ya la funci´on plot.

Aqu´ı, en el caso de los gr´aficos 3D tambi´en es posible a˜nadir tambi´en ele- mentos gr´aficos e incluso resultados de funciones, con la opci´on add, dentro de la funci´on plot3d, como se muestra en el ejercicio siguiente.

> x1<-rep(0,10) > y1<-x1

> z1<-seq(-1,15,2)

> plot3d(x1,y1,z1,col=rainbow(10),type="s",radius=0.9,add=TRUE)

donde, despu´es de hacer una rotaci´on, el resultado se observa como en la figura 53

Sin menospreciar a los gr´aficos de dispersi´on en 3D:

> library(rgl) > attach(mtcars)

> plot3d(wt, disp, mpg, col="red", size=5)

In document Universidad Nacional Autónoma de México (página 129-146)

Documento similar