2012-08-22 16 views
7

tengo este conjunto de datos:Como predecir valores de x de un modelo lineal (LM)

x <- c(0, 40, 80, 120, 160, 200) 
y <- c(6.52, 5.10, 4.43, 3.99, 3.75, 3.60) 

calculé un modelo lineal utilizando lm():

model <- lm(y ~ x) 

Quiero conocer los valores predichos de x si tengo nuevos valores y, por ej. ynew <- c(5.5, 4.5, 3.5), pero si uso la función predict(), solo calcula los valores y nuevos.

¿Cómo puedo predecir los nuevos valores x si tengo nuevos valores y?

Respuesta

3

Dado que este es un problema típico en la química (predecir valores de una calibración), el paquete chemCal proporciona inverse.predict. Sin embargo, esta función está limitada a "objetos modelo univariante [s] de la clase lm o rlm con la fórmula modelo y ~ x o y ~ x - 1".

x <- c(0, 40, 80, 120, 160, 200) 
y <- c(6.52, 5.10, 4.43, 3.99, 3.75, 3.60) 
plot(x,y) 
model <- lm(y ~ x) 
abline(model) 
require(chemCal) 
ynew <- c(5.5, 4.5, 3.5) 
xpred<-t(sapply(ynew,function(y) inverse.predict(model,y)[1:2])) 
# Prediction Standard Error 
#[1,] 31.43007 -38.97289  
#[2,] 104.7669 -36.45131  
#[3,] 178.1037 -39.69539 
points(xpred[,1],ynew,col="red") 

Advertencia: Esta función es bastante lento y no es adecuado, si es necesario inverse.predict un gran número de valores.

Si no recuerdo mal, el neg. Las SE se producen porque la función espera que la pendiente sea siempre positiva. Los valores absolutos de SE aún deberían ser correctos.

+1

por lo que vale, 'biblioteca (sos); findFn ("{predicción inversa}") 'encuentra esta función, así como una función similar en el paquete' quantchem' (que parece hacer una inversión no lineal también ...) –

4

creo que sólo hay que usar el álgebra para invertir y=a+b*x a x=(y-a)/b:

cc <- coef(model) 
(xnew <- (ynew-cc[1])/cc[2]) 
# [1] 31.43007 104.76689 178.10372 

plot(x,y 
abline(model) 
points(xnew,ynew,col=2) 

En cuanto a su 'datos' aquí, creo que una regresión no lineal podría ser mejor ...

enter image description here

+0

Sé que puedo resolver el problema con el álgebra pero pensé que hacer con algunas funciones de R. ¿Lo harías con una regresión no lineal? Gracias. – alexmulo

2

Si su relación no es monótona o si tiene múltiples valores de predicción, entonces puede haber múltiples valores-x para un valor y determinado y debe decidir cómo manejarlo.

Una opción que podría ser lento (y puede ser el método utilizado en los otros paquetes mencionados) es usar la función uniroot:

x <- runif(100, min=-1,max=2) 
y <- exp(x) + rnorm(100,0,0.2) 

fit <- lm(y ~ poly(x,3), x=TRUE) 
(tmp <- uniroot(function(x) predict(fit, data.frame(x=x)) - 4, c(-1, 2))$root) 
library(TeachingDemos) 
plot(x,y) 
Predict.Plot(fit, 'x', data=data.frame(x=x), add=TRUE, ref.val=tmp) 

usted podría utilizar la función TkPredict del paquete TeachingDemos a cara una solución.

O usted podría conseguir una aproximación bastante rápido mediante la generación de una gran cantidad de puntos previstos, a continuación, darles de comer a los approxfun o splinfun funciones para producir las aproximaciones:

tmpx <- seq(min(x), max(x), length.out=250) 
tmpy <- predict(fit, data.frame(x=tmpx)) 
tmpfun <- splinefun(tmpy, tmpx) 
tmpfun(4) 
Cuestiones relacionadas