आर एलएम में लापता मानों को कैसे संभालता है?


32

मैं मैट्रिक्स A में प्रत्येक कॉलम के खिलाफ एक वेक्टर B प्राप्त करना चाहता हूं। यह एक तुच्छ है यदि कोई लापता डेटा नहीं है, लेकिन यदि मैट्रिक्स A में लापता मान हैं, तो A के विरुद्ध मेरा प्रतिगमन केवल पंक्तियों को शामिल करने के लिए विवश है जहां सभी मान मौजूद हैं (डिफ़ॉल्ट na.omit व्यवहार)। यह बिना गुम हुए डेटा वाले कॉलमों के लिए गलत परिणाम देता है। मैं मैट्रिक्स A के व्यक्तिगत स्तंभों के विरुद्ध कॉलम मैट्रिक्स B को पुनः प्राप्त कर सकता हूं, लेकिन मेरे पास करने के लिए हजारों प्रतिगमन हैं, और यह निषेधात्मक रूप से धीमा और असंगत है। Na.exclude समारोह इस मामले के लिए तैयार किया जा रहा है, लेकिन मैं यह काम नहीं कर सकता। मुझसे यहां क्या गलत हो रहा है? अगर यह मायने रखता है, तो OSX पर R 2.13 का उपयोग करना।

A = matrix(1:20, nrow=10, ncol=2)
B = matrix(1:10, nrow=10, ncol=1)
dim(lm(A~B)$residuals)
# [1] 10 2 (the expected 10 residual values)

# Missing value in first column; now we have 9 residuals
A[1,1] = NA  
dim(lm(A~B)$residuals)
#[1]  9 2 (the expected 9 residuals, given na.omit() is the default)

# Call lm with na.exclude; still have 9 residuals
dim(lm(A~B, na.action=na.exclude)$residuals)
#[1]  9 2 (was hoping to get a 10x2 matrix with a missing value here)

A.ex = na.exclude(A)
dim(lm(A.ex~B)$residuals)
# Throws an error because dim(A.ex)==9,2
#Error in model.frame.default(formula = A.ex ~ B, drop.unused.levels = TRUE) : 
#  variable lengths differ (found for 'B')

1
"मैं प्रत्येक पंक्ति की गणना व्यक्तिगत रूप से कर सकता हूं" से आपका क्या अभिप्राय है?
chl

क्षमा करें, कहने का अर्थ है "मैं व्यक्तिगत रूप से कॉलम के खिलाफ कॉलम मैट्रिक्स बी को पुनः प्राप्त कर सकता हूं", जिसका अर्थ है एलएम पर एक-बार-एक कॉल। इसे प्रतिबिंबित करने के लिए संपादित किया गया।
डेविड क्विगले

1
एलएम / प्रतिगमन के लिए एक-बार-बार कॉल प्रतिगमन करने के बारे में जाने का एक शानदार तरीका नहीं है (प्रतिगमन की परिभाषा के द्वारा जाना जाता है, जो एक प्रतिक्रिया / परिणाम पर प्रत्येक भविष्यवक्ता के आंशिक प्रभाव को खोजने के लिए है जो दूसरे की स्थिति को देखते हुए है) चर)
कार्तिकस

जवाबों:


23

संपादित करें: मैंने आपके प्रश्न को गलत समझा। इसके दो पहलू हैं:

a) na.omitऔर na.excludeदोनों ही भविष्यवाणियों और कसौटियों के संबंध में कैविज़ विलोपन करते हैं। वे केवल कि निकालने कार्यों की तरह में मतभेद है residuals()या fitted()के साथ अपने उत्पादन इच्छा पैड NAके साथ छोड़े गए मामलों के लिए रों na.excludeहै, इस प्रकार इनपुट चर के रूप में ही लंबाई का उत्पादन कर रहे हैं।

> N    <- 20                               # generate some data
> y1   <- rnorm(N, 175, 7)                 # criterion 1
> y2   <- rnorm(N,  30, 8)                 # criterion 2
> x    <- 0.5*y1 - 0.3*y2 + rnorm(N, 0, 3) # predictor
> y1[c(1, 3,  5)] <- NA                    # some NA values
> y2[c(7, 9, 11)] <- NA                    # some other NA values
> Y    <- cbind(y1, y2)                    # matrix for multivariate regression
> fitO <- lm(Y ~ x, na.action=na.omit)     # fit with na.omit
> dim(residuals(fitO))                     # use extractor function
[1] 14  2

> fitE <- lm(Y ~ x, na.action=na.exclude)  # fit with na.exclude
> dim(residuals(fitE))                     # use extractor function -> = N
[1] 20  2

> dim(fitE$residuals)                      # access residuals directly
[1] 14  2

ख) असली मुद्दा इस अंतर के बीच का नहीं है na.omitऔर na.exclude, आप ऐसा नहीं चाहते हैं कि कैसवाइज़ विलोपन हो जो मानदंड चर को ध्यान में रखता है, जो दोनों करते हैं।

> X <- model.matrix(fitE)                  # design matrix
> dim(X)                                   # casewise deletion -> only 14 complete cases
[1] 14  2

प्रतिगमन परिणाम मैट्रिक्स पर निर्भर (डिजाइन मैट्रिक्स के Pseudoinverse एक्स , गुणांक β = एक्स + Y ) और टोपी मैट्रिक्स एच = एक्स एक्स + , फिट मान Y = एच )। यदि आप कैसवाइज़ विलोपन नहीं चाहते हैं, तो आपको Y के प्रत्येक कॉलम के लिए एक अलग डिज़ाइन मैट्रिक्स X की आवश्यकता होगीएक्स+=(एक्स'एक्स)-1एक्स'एक्सβ^=एक्स+Yएच=एक्सएक्स+Y^=एचYएक्सY, इसलिए प्रत्येक कसौटी के लिए अलग-अलग रजिस्टरों को फिट करने का कोई तरीका नहीं है। आप lm()निम्नलिखित की तर्ज पर कुछ करने से बचने की कोशिश कर सकते हैं :

> Xf <- model.matrix(~ x)                    # full design matrix (all cases)
# function: manually calculate coefficients and fitted values for single criterion y
> getFit <- function(y) {
+     idx   <- !is.na(y)                     # throw away NAs
+     Xsvd  <- svd(Xf[idx , ])               # SVD decomposition of X
+     # get X+ but note: there might be better ways
+     Xplus <- tcrossprod(Xsvd$v %*% diag(Xsvd$d^(-2)) %*% t(Xsvd$v), Xf[idx, ])
+     list(coefs=(Xplus %*% y[idx]), yhat=(Xf[idx, ] %*% Xplus %*% y[idx]))
+ }

> res <- apply(Y, 2, getFit)    # get fits for each column of Y
> res$y1$coefs
                   [,1]
(Intercept) 113.9398761
x             0.7601234

> res$y2$coefs
                 [,1]
(Intercept) 91.580505
x           -0.805897

> coefficients(lm(y1 ~ x))      # compare with separate results from lm()
(Intercept)           x 
113.9398761   0.7601234 

> coefficients(lm(y2 ~ x))
(Intercept)           x 
  91.580505   -0.805897

ध्यान दें कि और H को Caculate करने के लिए संख्यात्मक रूप से बेहतर तरीके हो सकते हैं, आप इसके बजाय Q R -decomposition की जाँच कर सकते हैं । एसवीडी-दृष्टिकोण को एसई पर यहां समझाया गया है । मैंने वास्तव में उपयोग करने के खिलाफ बड़े मैट्रिस वाई के साथ उपरोक्त दृष्टिकोण को समयबद्ध नहीं किया है ।एक्स+एचक्यूआरYlm()


यह समझ में आता है कि मेरी समझ यह है कि कैसे काम करना चाहिए। हालाँकि, अगर आप X.both = cbind (X1, X2) और फिर> मंद (lm (X.both ~ Y, na.action = na.exclude) $ अवशिष्ट) कहते हैं, तो आपको 97 और के बजाय 94 अवशेष मिलते हैं। 97.
डेविड क्विगले

यह एक सुधार है, लेकिन यदि आप अवशिष्ट (lm (X.both ~ Y, na.action = na.exclude)) को देखें, तो आप देखते हैं कि प्रत्येक स्तंभ में छह लापता मान हैं, भले ही X के कॉलम 1 में लापता मान हैं। दोनों स्तंभ 2 में उन लोगों की तुलना में अलग-अलग नमूनों से हैं। इसलिए na.exclude अवशिष्ट मैट्रिक्स के आकार को संरक्षित कर रहा है, लेकिन हुड आर के तहत स्पष्ट रूप से केवल एक्स.बॉथ की सभी पंक्तियों में मौजूद मूल्यों के साथ फिर से सक्रिय है। इसके लिए एक अच्छा सांख्यिकीय कारण हो सकता है, लेकिन मेरे आवेदन के लिए यह एक समस्या है।
डेविड क्विगले

@ डेविड मैंने आपके सवाल को गलत समझा था। मुझे लगता है कि मैं अब आपकी बात देख रहा हूं, और इसे संबोधित करने के लिए अपने उत्तर को संपादित कर दिया है।
काराकल

5

मैं दो तरह से सोच सकता हूं। एक संयोजन डेटा का उपयोग करें na.excludeऔर फिर अलग डेटा फिर से है:

A = matrix(1:20, nrow=10, ncol=2)
colnames(A) <- paste("A",1:ncol(A),sep="")

B = matrix(1:10, nrow=10, ncol=1)
colnames(B) <- paste("B",1:ncol(B),sep="")

C <- cbind(A,B)

C[1,1] <- NA
C.ex <- na.exclude(C)

A.ex <- C[,colnames(A)]
B.ex <- C[,colnames(B)]

lm(A.ex~B.ex)

एक और तरीका है कि dataतर्क का उपयोग करें और एक सूत्र बनाएं।

Cd <- data.frame(C)
fr <- formula(paste("cbind(",paste(colnames(A),collapse=","),")~",paste(colnames(B),collapse="+"),sep=""))

lm(fr,data=Cd)

Cd[1,1] <-NA

lm(fr,data=Cd,na.action=na.exclude)

यदि आप बहुत अधिक प्रतिगमन कर रहे हैं तो पहला तरीका तेज होना चाहिए, क्योंकि कम पृष्ठभूमि वाला जादू किया जाता है। यद्यपि यदि आपको केवल गुणांक और अवशेषों की आवश्यकता है, तो मैं उपयोग करने का सुझाव देता हूं lsfit, जो कि तुलना में बहुत तेज है lm। दूसरा तरीका थोड़ा अच्छा है, लेकिन मेरे लैपटॉप पर परिणामी प्रतिगमन पर सारांश करने की कोशिश करने से त्रुटि होती है। मैं यह देखने की कोशिश करूंगा कि क्या यह बग है।


धन्यवाद, लेकिन lm (A.ex ~ B.ex) आपके कोड में A1 (सही) के मुकाबले 9 अंक और A2 (अनड्रेस) के खिलाफ 9 अंक फिट बैठता है। बी 1 और ए 2 दोनों के लिए 10 मापा बिंदु हैं; मैं A2 के खिलाफ B1 के प्रतिगमन में एक बिंदु को बाहर फेंक रहा हूं क्योंकि संबंधित बिंदु A1 में गायब है। अगर यह सिर्फ ऐसा ही है तो मैं इसे स्वीकार कर सकता हूं, लेकिन यह वह नहीं है जो मैं आर करने के लिए कोशिश कर रहा हूं।
डेविड क्विगले

@ डेविड, ओह, ऐसा लग रहा है कि मैंने आपकी समस्या को गलत समझा है। मैं बाद में फिक्स पोस्ट करूँगा।
mpiktas

1

निम्नलिखित उदाहरण से पता चलता है कि मूल डेटाफ़्रेम के अनुरूप पूर्वानुमान और अवशिष्ट कैसे बनाए जाते हैं (एलए में) "na.action = na.exclude" विकल्प का उपयोग करके यह निर्दिष्ट करना कि NA का अवशिष्ट और पूर्वानुमान डॉक्टरों में रखा जाना चाहिए जहां मूल डेटाफ़्रेम लापता मान थे। यह यह भी दर्शाता है कि यह कैसे निर्दिष्ट किया जाए कि भविष्यवाणियों में केवल वे टिप्पणियां शामिल होनी चाहिए जिनमें व्याख्यात्मक और आश्रित चर दोनों पूर्ण थे (यानी, सख्ती से नमूना भविष्यवाणियों में) या वे अवलोकन जहां व्याख्यात्मक चर पूर्ण थे, और इसलिए Xb भविष्यवाणी संभव है ( यानी, टिप्पणियों के लिए आउट-ऑफ-सैंपल भविष्यवाणी सहित, जिसमें पूर्ण व्याख्यात्मक चर थे लेकिन आश्रित चर गायब थे)।

मैं मूल डेटासेट में अनुमानित और अवशिष्ट चर जोड़ने के लिए cbind का उपयोग करता हूं।

## Set up data with a linear model
N <- 10
NXmissing <- 2 
X <- runif(N, 0, 10)
Y <- 6 + 2*X + rnorm(N, 0, 1)
## Put in missing values (missing X, missing Y, missing both)
X[ sample(1:N , NXmissing) ] <- NA
Y[ sample(which(is.na(X)), 1)]  <- NA
Y[ sample(which(!is.na(X)), 1)]  <- NA
(my.df <- data.frame(X,Y))

## Run the regression with na.action specified to na.exclude
## This puts NA's in the residual and prediction vectors
my.lm  <- lm( Y ~ X, na.action=na.exclude, data=my.df)

## Predict outcome for observations with complete both explanatory and
## outcome variables, i.e. observations included in the regression
my.predict.insample  <- predict(my.lm)

## Predict outcome for observations with complete explanatory
## variables.  The newdata= option specifies the dataset on which
## to apply the coefficients
my.predict.inandout  <- predict(my.lm,newdata=my.df)

## Predict residuals 
my.residuals  <- residuals(my.lm)

## Make sure that it binds correctly
(my.new.df  <- cbind(my.df,my.predict.insample,my.predict.inandout,my.residuals))

## or in one fell swoop

(my.new.df  <- cbind(my.df,yhat=predict(my.lm),yhato=predict(my.lm,newdata=my.df),uhat=residuals(my.lm)))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.