R Language
रैखिक मॉडल (प्रतिगमन)
खोज…
वाक्य - विन्यास
- lm (सूत्र, डेटा, सबसेट, वज़न, na.action, विधि = "qr", मॉडल = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, इसके विपरीत = NULL, ऑफसेट, ।। ।)
पैरामीटर
पैरामीटर | अर्थ |
---|---|
सूत्र | विल्किंसन-रोजर्स संकेतन में एक सूत्र; response ~ ... जहां ... में पर्यावरण में चर या data तर्क द्वारा निर्दिष्ट डेटा फ़्रेम में संबंधित शब्द हैं |
डेटा | प्रतिक्रिया और भविष्यवक्ता चर वाले डेटा फ़्रेम |
सबसेट | सदिश का उपयोग करने के लिए टिप्पणियों का एक सबसेट निर्दिष्ट: data में चर के संदर्भ में एक तार्किक बयान के रूप में व्यक्त किया जा सकता है |
वजन | विश्लेषणात्मक भार (ऊपर वजन अनुभाग देखें) |
na.action | कैसे लापता ( NA ) मूल्यों को संभालने के लिए: देखें ?na.action |
तरीका | कैसे फिटिंग करने के लिए। केवल विकल्प "qr" या "model.frame" (उत्तरार्द्ध मॉडल को फिट किए बिना मॉडल फ्रेम को लौटाता है, निर्दिष्ट model=TRUE "model.frame" समान) |
नमूना | फिट की गई वस्तु में मॉडल फ्रेम को स्टोर करना है या नहीं |
एक्स | फिटेड ऑब्जेक्ट में मॉडल मैट्रिक्स को स्टोर करना है या नहीं |
y | क्या फिट किए गए ऑब्जेक्ट में मॉडल की प्रतिक्रिया को संग्रहीत करना है |
qr | क्या फिट किए गए ऑब्जेक्ट में क्यूआर अपघटन को स्टोर करना है |
singular.ok | क्या एकवचन की अनुमति देना है , कोलीनियर भविष्यवक्ताओं के साथ मॉडल (गुणांक का एक सबसेट स्वचालित रूप से NA सेट किया जाएगा) |
विरोधाभासों | मॉडल में विशेष कारकों के लिए उपयोग किए जाने वाले विरोधाभासों की एक सूची; contrasts.arg तर्क देखें ?model.matrix.default विरोधाभासों को options() साथ भी सेट किया जा सकता है options() ( contrasts तर्क देखें) या किसी कारक के contrast गुणों को असाइन करके (देखें ?contrasts ) |
ओफ़्सेट | मॉडल में एक प्राथमिकता ज्ञात घटक को निर्दिष्ट करने के लिए उपयोग किया जाता है। सूत्र के भाग के रूप में भी निर्दिष्ट किया जा सकता है। देखें ?model.offset |
... | निचले स्तर के फिटिंग कार्यों ( lm.fit() या lm.wfit() पारित होने के लिए अतिरिक्त तर्क |
Mtcars डेटासेट पर रैखिक प्रतिगमन
अंतर्निहित mtcars डेटा फ़्रेम में 32 कारों के बारे में जानकारी होती है, जिसमें उनके वजन, ईंधन दक्षता (मील-प्रति-गैलन में), गति आदि शामिल हैं (डेटासेट के बारे में अधिक जानने के लिए, help(mtcars)
उपयोग करें)।
यदि हम ईंधन दक्षता ( mpg
) और वजन ( wt
) के बीच संबंधों में रुचि रखते हैं, तो हम उन चरों के साथ साजिश शुरू कर सकते हैं:
plot(mpg ~ wt, data = mtcars, col=2)
भूखंड (रैखिक) संबंध दिखाता है! फिर अगर हम एक रैखिक मॉडल के गुणांक निर्धारित करने के लिए रैखिक प्रतिगमन करना चाहते हैं, तो हम lm
फ़ंक्शन का उपयोग करेंगे:
fit <- lm(mpg ~ wt, data = mtcars)
~
का अर्थ "द्वारा समझाया गया" है, इसलिए सूत्र mpg ~ wt
अर्थ है कि हम mpg की भविष्यवाणी कर रहे हैं जैसा कि wt द्वारा समझाया गया है। आउटपुट को देखने का सबसे सहायक तरीका निम्न है:
summary(fit)
जो आउटपुट देता है:
Call:
lm(formula = mpg ~ wt, data = mtcars)
Residuals:
Min 1Q Median 3Q Max
-4.5432 -2.3647 -0.1252 1.4096 6.8727
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 37.2851 1.8776 19.858 < 2e-16 ***
wt -5.3445 0.5591 -9.559 1.29e-10 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.046 on 30 degrees of freedom
Multiple R-squared: 0.7528, Adjusted R-squared: 0.7446
F-statistic: 91.38 on 1 and 30 DF, p-value: 1.294e-10
इसके बारे में जानकारी प्रदान करता है:
- प्रत्येक गुणांक (
wt
और y- इंटरसेप्ट) की अनुमानित ढलान, जो mpg का सबसे अच्छा फिट होने का अनुमान37.2851 + (-5.3445) * wt
- प्रत्येक गुणांक का पी-मूल्य, जो बताता है कि अवरोधन और भार संभवतः संयोग के कारण नहीं हैं
- फिट के समग्र अनुमान जैसे कि R ^ 2 और समायोजित R ^ 2, जो बताते हैं कि
mpg
में कितनी भिन्नता मॉडल द्वारा बताई गई है
हम पूर्वानुमानित mpg
दिखाने के लिए अपने पहले प्लॉट में एक पंक्ति जोड़ सकते हैं:
abline(fit,col=3,lwd=2)
उस भूखंड के समीकरण को जोड़ना भी संभव है। सबसे पहले, के साथ गुणांक पाने coef
। तब paste0
का उपयोग paste0
हम समीकरण बनाने के लिए उपयुक्त चर और +/-
साथ गुणांक को ढहते हैं। अंत में, हम इसे mtext
का उपयोग करके प्लॉट में mtext
:
bs <- round(coef(fit), 3)
lmlab <- paste0("mpg = ", bs[1],
ifelse(sign(bs[2])==1, " + ", " - "), abs(bs[2]), " wt ")
mtext(lmlab, 3, line=-2)
प्रतिगमन (आधार) प्लॉटिंग
mtcars
उदाहरण पर जारी रखते हुए, यहां अपने रैखिक प्रतिगमन के एक भूखंड का उत्पादन करने का एक सरल तरीका है जो प्रकाशन के लिए संभवतः उपयुक्त है।
पहले लीनियर मॉडल को फिट करें और
fit <- lm(mpg ~ wt, data = mtcars)
फिर ब्याज के दो चर को प्लॉट करें और परिभाषा डोमेन के भीतर प्रतिगमन लाइन जोड़ें:
plot(mtcars$wt,mtcars$mpg,pch=18, xlab = 'wt',ylab = 'mpg')
lines(c(min(mtcars$wt),max(mtcars$wt)),
as.numeric(predict(fit, data.frame(wt=c(min(mtcars$wt),max(mtcars$wt))))))
लगभग वहाँ पहुँच गया! अंतिम चरण भूखंड, प्रतिगमन समीकरण, rsquare के साथ-साथ सहसंबंध गुणांक को जोड़ना है। यह vector
फ़ंक्शन का उपयोग करके किया vector
है:
rp = vector('expression',3)
rp[1] = substitute(expression(italic(y) == MYOTHERVALUE3 + MYOTHERVALUE4 %*% x),
list(MYOTHERVALUE3 = format(fit$coefficients[1], digits = 2),
MYOTHERVALUE4 = format(fit$coefficients[2], digits = 2)))[2]
rp[2] = substitute(expression(italic(R)^2 == MYVALUE),
list(MYVALUE = format(summary(fit)$adj.r.squared,dig=3)))[2]
rp[3] = substitute(expression(Pearson-R == MYOTHERVALUE2),
list(MYOTHERVALUE2 = format(cor(mtcars$wt,mtcars$mpg), digits = 2)))[2]
legend("topright", legend = rp, bty = 'n')
ध्यान दें कि आप वेक्टर फ़ंक्शन को स्वीकार करके RMSE जैसे किसी अन्य पैरामीटर को जोड़ सकते हैं। कल्पना कीजिए कि आप 10 तत्वों के साथ एक किंवदंती चाहते हैं। वेक्टर परिभाषा निम्नलिखित होगी:
rp = vector('expression',10)
और आपको परिभाषित r[1]
.... to r[10]
यहाँ उत्पादन है:
भार
कभी-कभी हम चाहते हैं कि मॉडल दूसरों की तुलना में कुछ डेटा बिंदुओं या उदाहरणों को अधिक वजन दे। मॉडल सीखते समय इनपुट डेटा के लिए वजन निर्दिष्ट करके यह संभव है। आम तौर पर दो प्रकार के परिदृश्य होते हैं जहाँ हम उदाहरणों पर गैर-समान भार का उपयोग कर सकते हैं:
- विश्लेषणात्मक भार: विभिन्न अवलोकनों की सटीकता के विभिन्न स्तरों को दर्शाते हैं। उदाहरण के लिए, यदि डेटा का विश्लेषण जहां प्रत्येक अवलोकन भौगोलिक क्षेत्र से औसत परिणाम है, तो विश्लेषणात्मक भार अनुमानित विचरण के व्युत्क्रमानुपाती होता है। प्रेक्षणों की संख्या को देखते हुए आनुपातिक भार प्रदान करके डेटा में औसत से निपटने के लिए उपयोगी। स्रोत
- सैम्पलिंग वेट (उलटा प्रायिकता वज़न - IPW): आँकड़ों की गणना के लिए एक सांख्यिकीय तकनीक जो उस डेटा से एकत्र की गई जनसंख्या से अलग है। एक विषम नमूना जनसंख्या और लक्ष्य निर्धारण की आबादी (लक्ष्य जनसंख्या) के साथ अध्ययन डिजाइन आवेदन में आम हैं। लापता मान वाले डेटा के साथ काम करते समय उपयोगी। स्रोत
lm()
फ़ंक्शन एनालिटिकल वेटिंग करता है। सैंपलिंग वेट के लिए survey
पैकेज का उपयोग एक सर्वेक्षण डिज़ाइन ऑब्जेक्ट बनाने और svyglm()
चलाने के लिए किया जाता है। डिफ़ॉल्ट रूप से, survey
पैकेज नमूना भार का उपयोग करता है। (नोट: lm()
, और svyglm()
साथ gaussian()
सभी एक ही बिंदु अनुमान का उत्पादन करेंगे, क्योंकि वे दोनों गुणांक के लिए कम से कम भार वर्ग को हल करते हैं। वे मानक त्रुटियों की गणना कैसे की जाती हैं, इसमें भिन्नता है।)
परीक्षण डेटा
data <- structure(list(lexptot = c(9.1595012302023, 9.86330744180814,
8.92372556833205, 8.58202430280175, 10.1133857229336), progvillm = c(1L,
1L, 1L, 1L, 0L), sexhead = c(1L, 1L, 0L, 1L, 1L), agehead = c(79L,
43L, 52L, 48L, 35L), weight = c(1.04273509979248, 1.01139605045319,
1.01139605045319, 1.01139605045319, 0.76305216550827)), .Names = c("lexptot",
"progvillm", "sexhead", "agehead", "weight"), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -5L))
विश्लेषणात्मक वजन
lm.analytic <- lm(lexptot ~ progvillm + sexhead + agehead,
data = data, weight = weight)
summary(lm.analytic)
उत्पादन
Call:
lm(formula = lexptot ~ progvillm + sexhead + agehead, data = data,
weights = weight)
Weighted Residuals:
1 2 3 4 5
9.249e-02 5.823e-01 0.000e+00 -6.762e-01 -1.527e-16
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 10.016054 1.744293 5.742 0.110
progvillm -0.781204 1.344974 -0.581 0.665
sexhead 0.306742 1.040625 0.295 0.818
agehead -0.005983 0.032024 -0.187 0.882
Residual standard error: 0.8971 on 1 degrees of freedom
Multiple R-squared: 0.467, Adjusted R-squared: -1.132
F-statistic: 0.2921 on 3 and 1 DF, p-value: 0.8386
सैंपलिंग वेट (IPW)
library(survey)
data$X <- 1:nrow(data) # Create unique id
# Build survey design object with unique id, ipw, and data.frame
des1 <- svydesign(id = ~X, weights = ~weight, data = data)
# Run glm with survey design object
prog.lm <- svyglm(lexptot ~ progvillm + sexhead + agehead, design=des1)
उत्पादन
Call:
svyglm(formula = lexptot ~ progvillm + sexhead + agehead, design = des1)
Survey design:
svydesign(id = ~X, weights = ~weight, data = data)
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 10.016054 0.183942 54.452 0.0117 *
progvillm -0.781204 0.640372 -1.220 0.4371
sexhead 0.306742 0.397089 0.772 0.5813
agehead -0.005983 0.014747 -0.406 0.7546
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for gaussian family taken to be 0.2078647)
Number of Fisher Scoring iterations: 2
बहुपद प्रतिगमन के साथ nonlinearity के लिए जाँच
कभी-कभी रैखिक प्रतिगमन के साथ काम करते समय हमें डेटा में गैर-रैखिकता की जांच करने की आवश्यकता होती है। ऐसा करने का एक तरीका एक बहुपद मॉडल को फिट करना है और यह जांचना है कि क्या यह एक रैखिक मॉडल की तुलना में बेहतर डेटा फिट बैठता है। ऐसे अन्य कारण हैं, जैसे कि सैद्धांतिक, जो एक द्विघात या उच्चतर क्रम मॉडल को इंगित करने के लिए संकेत देता है क्योंकि यह माना जाता है कि चर संबंध स्वाभाविक रूप से बहुपद है।
mtcars
डेटासेट के लिए एक द्विघात मॉडल फिट करते हैं। रैखिक मॉडल के लिए mtcars डेटासेट पर रैखिक प्रतिगमन देखें।
पहले हम चर का एक बिखराव साजिश बनाने के mpg
(मील / गैलन), disp
(विस्थापन (cu.in.)), और wt
(वजन (1000 पाउंड))। mpg
और disp
के बीच संबंध गैर-रैखिक दिखाई देता है।
plot(mtcars[,c("mpg","disp","wt")])
एक रेखीय फिट दिखाएगा कि disp
महत्वपूर्ण नहीं है।
fit0 = lm(mpg ~ wt+disp, mtcars)
summary(fit0)
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
#(Intercept) 34.96055 2.16454 16.151 4.91e-16 ***
#wt -3.35082 1.16413 -2.878 0.00743 **
#disp -0.01773 0.00919 -1.929 0.06362 .
#---
#Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#Residual standard error: 2.917 on 29 degrees of freedom
#Multiple R-squared: 0.7809, Adjusted R-squared: 0.7658
फिर, एक द्विघात मॉडल का परिणाम प्राप्त करने के लिए, हमने I(disp^2)
जोड़ा। R^2
समय नया मॉडल बेहतर दिखाई देता है और सभी चर महत्वपूर्ण होते हैं।
fit1 = lm(mpg ~ wt+disp+I(disp^2), mtcars)
summary(fit1)
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
#(Intercept) 41.4019837 2.4266906 17.061 2.5e-16 ***
#wt -3.4179165 0.9545642 -3.581 0.001278 **
#disp -0.0823950 0.0182460 -4.516 0.000104 ***
#I(disp^2) 0.0001277 0.0000328 3.892 0.000561 ***
#---
#Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#Residual standard error: 2.391 on 28 degrees of freedom
#Multiple R-squared: 0.8578, Adjusted R-squared: 0.8426
जैसा कि हमारे पास तीन चर हैं, सज्जित मॉडल एक सतह है जिसका प्रतिनिधित्व करता है:
mpg = 41.4020-3.4179*wt-0.0824*disp+0.0001277*disp^2
बहुपद प्रतिगमन को निर्दिष्ट करने का एक अन्य तरीका पैरामीटर raw=TRUE
साथ poly
का उपयोग कर रहा है, अन्यथा ऑर्थोगोनल बहुपद help(ploy)
अधिक जानकारी के लिए help(ploy)
देखें) पर विचार किया जाएगा। हमें एक ही परिणाम प्राप्त होता है:
summary(lm(mpg ~ wt+poly(disp, 2, raw=TRUE),mtcars))
अंत में, क्या होगा यदि हमें अनुमानित सतह के एक भूखंड को दिखाने की आवश्यकता है? वैसे R
में 3D
प्लॉट बनाने के लिए कई विकल्प हैं। यहाँ हम का उपयोग Fit3d
से p3d
पैकेज।
library(p3d)
Init3d(family="serif", cex = 1)
Plot3d(mpg ~ disp+wt, mtcars)
Axes3d()
Fit3d(fit1)
गुणवत्ता मूल्यांकन
एक प्रतिगमन मॉडल के निर्माण के बाद परिणाम की जांच करना और यह तय करना महत्वपूर्ण है कि क्या मॉडल उपयुक्त है और हाथ में डेटा के साथ अच्छी तरह से काम करता है। यह अवशेष प्लॉट और साथ ही अन्य नैदानिक भूखंडों की जांच करके किया जा सकता है।
# fit the model
fit <- lm(mpg ~ wt, data = mtcars)
#
par(mfrow=c(2,1))
# plot model object
plot(fit, which =1:2)
ये भूखंड दो मान्यताओं की जाँच करते हैं जो मॉडल बनाते समय बनाई गई थीं:
- कि अनुमानित चर (इस मामले में
mpg
) में अनुमानित मूल्य भविष्यवाणियों के एक रैखिक संयोजन (इस मामले मेंwt
) द्वारा दिया गया है। हम उम्मीद करते हैं कि यह अनुमान निष्पक्ष होगा। तो अवशिष्ट भविष्यवक्ताओं के सभी मूल्यों के लिए अर्थ के आसपास केंद्रित होना चाहिए। इस मामले में हम देखते हैं कि अवशिष्ट अंत में सकारात्मक होते हैं और बीच में नकारात्मक, चर के बीच एक गैर-रैखिक संबंध का सुझाव देते हैं। - कि वास्तविक अनुमानित चर सामान्य रूप से अपने अनुमान के आसपास वितरित किया जाता है। इस प्रकार, अवशिष्टों को सामान्य रूप से वितरित किया जाना चाहिए। सामान्य रूप से वितरित डेटा के लिए, एक सामान्य क्यूक्यू भूखंड में अंक विकर्ण पर या उसके करीब होना चाहिए। यहाँ सिरों पर तिरछी कुछ मात्रा है।
'प्रेडिक्ट' फ़ंक्शन का उपयोग करना
एक बार एक मॉडल बनाया गया है predict
नए डेटा के साथ परीक्षण करने के लिए मुख्य कार्य है। हमारे उदाहरण का उपयोग करेगा mtcars
निर्मित विस्थापन के खिलाफ प्रति गैलन वापसी मील डाटासेट:
my_mdl <- lm(mpg ~ disp, data=mtcars)
my_mdl
Call:
lm(formula = mpg ~ disp, data = mtcars)
Coefficients:
(Intercept) disp
29.59985 -0.04122
यदि मेरे पास विस्थापन के साथ एक नया डेटा स्रोत था तो मैं प्रति गैलन अनुमानित मील देख सकता था।
set.seed(1234)
newdata <- sample(mtcars$disp, 5)
newdata
[1] 258.0 71.1 75.7 145.0 400.0
newdf <- data.frame(disp=newdata)
predict(my_mdl, newdf)
1 2 3 4 5
18.96635 26.66946 26.47987 23.62366 13.11381
प्रक्रिया का सबसे महत्वपूर्ण हिस्सा मूल डेटा के समान कॉलम नाम के साथ एक नया डेटा फ़्रेम बनाना है। इस मामले में, मूल डेटा में एक स्तंभ लेबल disp
था, मुझे उसी नाम के नए डेटा को कॉल करना सुनिश्चित था।
सावधान
आइए कुछ सामान्य नुकसान देखें:
नए ऑब्जेक्ट में data.frame का उपयोग नहीं कर रहा है:
predict(my_mdl, newdata) Error in eval(predvars, data, env) : numeric 'envir' arg not of length one
नए डेटा फ़्रेम में समान नामों का उपयोग नहीं करना:
newdf2 <- data.frame(newdata) predict(my_mdl, newdf2) Error in eval(expr, envir, enclos) : object 'disp' not found
शुद्धता
भविष्यवाणी की सटीकता की जांच करने के लिए आपको नए डेटा के वास्तविक y मूल्यों की आवश्यकता होगी। इस उदाहरण में, newdf
को 'mpg' और 'disp' के लिए एक कॉलम की आवश्यकता होगी।
newdf <- data.frame(mpg=mtcars$mpg[1:10], disp=mtcars$disp[1:10])
# mpg disp
# 1 21.0 160.0
# 2 21.0 160.0
# 3 22.8 108.0
# 4 21.4 258.0
# 5 18.7 360.0
# 6 18.1 225.0
# 7 14.3 360.0
# 8 24.4 146.7
# 9 22.8 140.8
# 10 19.2 167.6
p <- predict(my_mdl, newdf)
#root mean square error
sqrt(mean((p - newdf$mpg)^2, na.rm=TRUE))
[1] 2.325148