2012-08-22 15 views
7

मैं इस डेटा सेट है:एक रेखीय मॉडल से एक्स मूल्यों का अनुमान कैसे (एल एम)

model <- lm(y ~ x) 

मैं की भविष्यवाणी मूल्यों जानते हैं:

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

मैं एक रेखीय मॉडल का उपयोग कर lm() गणना x यदि मेरे पास नया y मान है, उदाहरण के लिए ynew <- c(5.5, 4.5, 3.5), लेकिन अगर मैं predict() फ़ंक्शन का उपयोग करता हूं, तो यह केवल नए y मानों की गणना करता है।

यदि मेरे पास y मान हैं तो मैं नए x मानों की भविष्यवाणी कैसे कर सकता हूं?

उत्तर

3

चूंकि यह रसायन शास्त्र में एक सामान्य समस्या है (अंशांकन से मूल्यों की भविष्यवाणी करें), पैकेज chemCalinverse.predict प्रदान करता है। हालांकि, यह फ़ंक्शन क्लास एलएम या आरएलएम के मॉडल फॉर्मूला वाई ~ एक्स या वाई ~ एक्स -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") 

चेतावनी: यह समारोह यदि आप मूल्यों की एक बड़ी संख्या inverse.predict की जरूरत है, काफी धीमी गति से और उपयुक्त नहीं है।

अगर मुझे सही याद है, तो नकारात्मक। एसई होती है क्योंकि कार्य अपेक्षा करता है कि ढलान हमेशा सकारात्मक रहे। एसई के पूर्ण मूल्य अभी भी सही होना चाहिए।

+1

इसके लायक होने के लिए, 'लाइब्रेरी (एसओएस); findFn ("{उलटा भविष्यवाणी}") 'इस फ़ंक्शन को ढूंढता है, साथ ही' quantchem' पैकेज में एक समान कार्य (जो nonlinear उलटा करने के लिए प्रतीत होता है ...) –

4

मुझे लगता है कि तुम सिर्फ उलटने के लिए y=a+b*xx=(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) 

, मुझे लगता है कि एक nonlinear प्रतिगमन बेहतर हो सकता है ...

enter image description here

+0

मुझे पता है कि मैं बीजगणित के साथ समस्या को हल कर सकते हैं लेकिन मैंने सोचा कि कुछ आर कार्यों के साथ बनाओ। क्या आप इसे एक गैर-रैखिक प्रतिगमन के साथ बनायेंगे? धन्यवाद। – alexmulo

2

यदि आपका रिश्ते नॉनमोनोटोन है या यदि आपके पास एकाधिक पूर्वानुमान मूल्य हैं तो किसी दिए गए वाई-मान के लिए कई एक्स-मान हो सकते हैं और आपको यह तय करने की आवश्यकता है कि इससे कैसे निपटें।

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) 

आप एक नजर डालने के लिए TeachingDemos पैकेज से TkPredict समारोह इस्तेमाल कर सकते हैं:

एक विकल्प है कि धीमी गति से हो सकता है (और अन्य संकुल उल्लेख में प्रयोग किया जाता विधि हो सकता है) uniroot समारोह का उपयोग करने के लिए है उपाय।

या आप, भविष्यवाणी अंक का एक बहुत पैदा तो उन्हें approxfun या splinfun कार्यों के लिए खिला अनुमानों का उत्पादन करने के द्वारा एक काफी त्वरित सन्निकटन मिल सकता है:

tmpx <- seq(min(x), max(x), length.out=250) 
tmpy <- predict(fit, data.frame(x=tmpx)) 
tmpfun <- splinefun(tmpy, tmpx) 
tmpfun(4) 
संबंधित मुद्दे