Método de scoring. Ejercicio trivial para la obtención del EMV de p en una binomial, observados a=57 éxitos y b=482 fallos. > a <- 57 > b <- 482 EMV de p > pe <- a/(a + b) Logverosimilitud de p: > logL <- function( p ) { a*log( p ) + b*log( 1-p ) } Score de p: > dlogL <- function( p ) { a/p - b/(1-p) } ### función score > d2logL <- function( p ) { -a/p^2 - b/(1-p)^2 } Información observada: > Iobs <- function( p ) { -d2logL( p ) } Error estándar del EMV de p: > se.pe <- sqrt( 1 / Iobs( pe ) ) > options( digits=4 ) > cbind(pe, se.pe) pe se.pe [1,] 0.1058 0.01325 Algoritmo SCORING (Newton) para calcular el EMV de p: > > > > > > > p0 <- 0.03 ### valor inicial iter <- 0 ### número de iteraciones toler <- 1 ### tolerancia pemv <- NULL ### p estimado solución de ecuación de verosimilitud pemv[1] <- p0 se.pemv <- NULL ### se del emv de p se.pemv[1] <- sqrt( -1/d2logL(pemv[1]) ) > + + + + + while( (toler > 0.000001) && (iter < 100) ) { iter <- iter + 1 pemv[iter+1] <- pemv[iter] - dlogL(pemv[iter]) / d2logL(pemv[iter]) se.pemv[iter+1] <- sqrt( -1/d2logL(pemv[iter+1]) ) toler <- abs( pemv[iter+1] - pemv[iter] ) } > cbind( pemv, se.pemv ) pemv se.pemv [1,] 0.03000 0.003958 [2,] 0.05198 0.006799 [3,] 0.07916 0.010173 [4,] 0.09951 0.012548 [5,] 0.10542 0.013209 [6,] 0.10575 0.013246 [7,] 0.10575 0.013246 1 Gráfico para explicar el método de Newton: > pp <- seq(0.025, 0.13, length=100) > x11() > j <- iter+1 > plot(pp, dlogL(pp), type = "l", lwd=2, main="algoritmo de Scoring", cex.main=0.9, + xlab="p: probabilidad de fallo en un solo uso", ylab="dlogL: score de p" ) > text(0.028, 50, labels="p0") > text( pemv[j]+0.005, 50, labels="pEMV" ) > abline( h=0 ) > points(pemv[1:j], dlogL(pemv[1:j])) > points(pemv[1:j], rep(0, j)) > ddlpt <- d2logL(pemv[1:j]) > for(i in 2:4) { + abline( ( - pemv[i] * dlogL( pemv[i - 1]) ) / (pemv[i - 1] - pemv[i]), + dlogL( pemv[i - 1] ) / (pemv[i - 1] - pemv[i]) ) + } > segments( pemv[1:j], 0, pemv[1:j], dlogL(pemv[1:j]), lty=3 ) 1000 500 0 dlogL: score de p 1500 algoritmo de Scoring p0 pEMV 0.04 0.06 0.08 0.10 0.12 p: probabilidad de fallo en un solo uso 2 > > > > ### ### ### ### PUROMICINA De M. M. y V. Velocidad de una reacción enzimática donde el substrato ### ha sido tratado con diferentes dosis de puromycina ### Modelo Michaelis-Menton: E(Y|x) = b1*x/(b2+x); Y = E(Y|x) + e ### > cp <- c( 0.02, 0.06, 0.11, 0.22, 0.56, 1.10 ) ### concentracion de puromycina > v1 <- c( 47, 97, 123, 152, 191, 200 ) ### velocidad de reaccion bajo cp > v2 <- c( 76, 107, 139, 159, 201, 207 ) ### velocidad de reaccion bajo cp > x <- rep( cp, 2 ) > y <- c( v1, v2 ) > n <- length(x) > > > > > ####################################################### ### Modelo Michaelis-Menten: y = E(Y|x)+e con E(Y|x) = b1*x/(b2+x) ### En x=0 la media es 0. La media es creciente en x. ### La media tiende a b1 si x tiende a infinito. ### b2 es el valor de x para una media igual de b1/2. > > > > ### Ajuste directo mediante linealización b10 <- 200 ### valores de inicio x0 <- 0.2; y0 <- 150; b20 <- b10*x0/y0 - x0 > b0 <- c(b10,b20) > b0 [1] 200.00000000 0.06666667 > > > > ### fxb d1 d2 función media y sus derivadas <- function(b){ b[1]*x/(b[2]+x) } <- function(b) { x/(b[2]+x) } <- function(b) { -d1(b)*b[1]/(b[2]+x) } > bb1 <- NULL > bb2 <- NULL > bb1[1] <- b10; bb2[1] <- b20; > i <- 0 > toler <- 1 > + + + + + + + + + + > ### iteraciones ### tolerancia while( (toler > 0.00001) && (i < 100) ){ i <- i+1 bb0 <- c(bb1[i], bb2[i]) fxbb0 <- fxb(bb0) dd1 <- d1(bb0) dd2 <- d2(bb0) DD <- cbind( dd1, dd2 ) bbb <- c(bb1[i],bb2[i]) + solve(t(DD)%*%DD)%*%t(DD)%*%(y-fxbb0) bb1[i+1] <- bbb[1]; bb2[i+1] <- bbb[2]; toler <- max(abs(bb1[i+1]-bb1[i]), abs(bb2[i+1]-bb2[i])) } cbind(bb1,bb2) ### betas estimados en el proceso iterativo bb1 bb2 [1,] 200.0000 0.06666667 [2,] 212.8231 0.06416042 [3,] 212.6862 0.06412506 [4,] 212.6840 0.06412165 [5,] 212.6838 0.06412132 [6,] 212.6837 0.06412129 [7,] 212.6837 0.06412128 3 > ### betas estimados > b1 <- bb1[length(bb1)]; b2 <- bb2[length(bb2)] > cbind( b1, b2 ) b1 b2 [1,] 212.6837 0.06412128 > ### s2: varianza residual ¡NO EMV! > s2 <- sum( (y - fxb(c(b1,b2)))^2 )/(n-2) > sqrt(s2) ### error estándar residual [1] 10.93366 > ###Covarianza asintótica de betas (errores normales) > vbetas <- s2*solve(t(DD)%*%DD) > round( vbetas, 6 ) dd1 dd2 dd1 48.262966 0.044015 dd2 0.044015 0.000069 > > > > ### errores estándar de betas y su correlación se.b1 <- as.numeric( sqrt(diag(vbetas))[1] ) se.b2 <- as.numeric( sqrt(diag(vbetas))[2] ) cor.b1.b2 <- as.numeric( vbetas[1,2]/(se.b1*se.b2) ) > cbind( b1, se.b1, b2, se.b2, cor.b1.b2 ) b1 se.b1 b2 se.b2 cor.b1.b2 [1,] 212.6837 6.947155 0.06412128 0.00828095 0.7650837 4