কীভাবে আর এল এম এ হারিয়ে যাওয়া মানগুলি পরিচালনা করে?


32

আমি ম্যাট্রিক্স এ এর ​​প্রতিটি কলামের বিরুদ্ধে একটি ভেক্টর বিকে পুনরায় চাপিয়ে দিতে চাই, যদি কোনও অনুপস্থিত তথ্য না পাওয়া যায় তবে এটি তুচ্ছ, তবে যদি ম্যাট্রিক্স এ-তে অনুপস্থিত মান রয়েছে, তবে এ এর ​​বিরুদ্ধে আমার প্রতিরোধকে কেবল সারি অন্তর্ভুক্ত করতে বাধ্য করা হবে যেখানে সমস্ত মান উপস্থিত থাকে (ডিফল্ট na.omit আচরণ)। এটি কোনও অনুপস্থিত ডেটা ছাড়াই কলামগুলির জন্য ভুল ফলাফল উত্পন্ন করে। আমি ম্যাট্রিক্স এ এর ​​স্বতন্ত্র কলামগুলির বিপরীতে কলাম ম্যাট্রিক্স বি পুনরায় চাপতে পারি, তবে আমার হাজার হাজার রেজিস্ট্রেশন করতে হবে এবং এটি নিষেধাজ্ঞামূলকভাবে ধীর এবং অকার্যকর। Na.exclude ফাংশন এই ক্ষেত্রে জন্য ডিজাইন করা হবে বলে মনে হয়, কিন্তু আমি এটা কাজ করতে পারবেন না। আমি এখানে কি ভুল করছি? ওএসএক্সে আর 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

সম্পাদনা: আপনার প্রশ্নটি আমি ভুল বুঝেছি। দুটি দিক রয়েছে:

ক) na.omitএবং na.excludeউভয়ই ভবিষ্যদ্বাণীকারী এবং মানদণ্ড উভয় ক্ষেত্রেই কেসওয়াইজ মুছে ফেলতে পারে। এগুলি কেবল কেবল এক্সট্রাক্টর ফাংশনগুলির মধ্যেই পৃথক residuals()বা বাদ দেওয়া ক্ষেত্রে fitted()তাদের আউটপুটকে প্যাড করবে যেমন এইভাবে ইনপুট ভেরিয়েবলগুলির সমান দৈর্ঘ্যের আউটপুট থাকে havingNAna.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

এক্স+ +=(এক্স'এক্স)-1এক্স'এক্সβ^=এক্স+ +ওয়াইএইচ=এক্সএক্স+ +ওয়াই^=এইচওয়াইএক্সওয়াই, সুতরাং প্রতিটি মানদণ্ডের জন্য পৃথক নিয়ন্ত্রণগুলি ফিট করার কোনও উপায় নেই। আপনি 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

দ্রষ্টব্য যে সঞ্চার করার জন্য সংখ্যাগতভাবে আরও ভাল উপায় থাকতে পারেএক্স+ +এইচপ্রশ্নঃআরওয়াইlm()


না.এক্সক্লুডে কীভাবে কাজ করা উচিত সে সম্পর্কে আমার বোঝাপড়াটি উপলব্ধি করে। তবে, আপনি যদি> X.both = cbind (X1, X2) এবং তারপরে> ডিমে (lm (X.both ~ Y, না.অ্যাকশন = na.exclude) id অবশিষ্টগুলি) কল করেন তবে আপনি এখনও 97 এর পরিবর্তে 94 টি অবশিষ্টাংশ পাবেন 97.
ডেভিড কুইগলে

এটি একটি উন্নতি, তবে আপনি যদি অবশিষ্টাংশগুলিতে লক্ষ্য করেন (এলএম (এক্স.বোথ ~ ওয়াই, না.অ্যাকশন = না.এক্সক্লুয়েড)), আপনি দেখতে পাবেন যে প্রতিটি কলামে ছয়টি অনুপস্থিত মান রয়েছে, যদিও X এর 1 কলামে অনুপস্থিত মান রয়েছে though উভয়ই কলাম ২-এর চেয়ে আলাদা নমুনা থেকে So সুতরাং না.এক্সক্লুড ম্যাট্রিক্সের অবশিষ্টাংশের আকৃতি সংরক্ষণ করছে, তবে হুড আর এর নিচে দৃশ্যমানভাবে কেবল এক্স.বোথের সমস্ত সারিতে উপস্থিত মানগুলির সাথে প্রত্যাশা করা হচ্ছে। এটির জন্য একটি ভাল পরিসংখ্যানগত কারণ থাকতে পারে, তবে আমার আবেদনের জন্য এটি একটি সমস্যা।
ডেভিড কুইগলে

@ ডেভিড আমি আপনার প্রশ্নটি ভুল বুঝেছিলাম। আমি মনে করি আমি এখন আপনার পয়েন্টটি দেখছি, এবং আমার উত্তরটি এটি সম্পাদনের জন্য সম্পাদনা করেছি।
কারাকাল

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 এ অনুপস্থিত। যদি এটি কেবলমাত্র এটির কাজ করে তবে আমি তা মেনে নিতে পারি, তবে আর করার চেষ্টা করছি না।
ডেভিড কুইগলে

@ ডেভিড, ওহ, দেখে মনে হচ্ছে আমি আপনার সমস্যাটি ভুল বুঝেছি। আমি ঠিক পরে পোস্ট করব।
এমপিটকাস

1

নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে পূর্বাভাস এবং অবশিষ্টাংশ তৈরি করা যায় যা মূল ডেটাফ্রেমের সাথে সামঞ্জস্য করে (এলএএম () এর "na.action = na.excolve" বিকল্পটি ব্যবহার করে যে এনএ'র অবশ্যই অবশিষ্ট তথ্য এবং ভবিষ্যদ্বাণী ভেক্টরগুলিতে স্থাপন করা উচিত যেখানে মূল ডেটাফ্রেম হবে এটি অনুমান করে যে কীভাবে পূর্বাভাসে কেবলমাত্র পর্যবেক্ষণ অন্তর্ভুক্ত করা উচিত যেখানে ব্যাখ্যাযোগ্য এবং নির্ভরশীল ভেরিয়েবল উভয়ই সম্পূর্ণ ছিল (যেমন কঠোরভাবে নমুনা পূর্বাভাস) বা পর্যবেক্ষণযোগ্য যেখানে বর্ণনামূলক ভেরিয়েবলগুলি সম্পূর্ণ ছিল, এবং তাই এক্সবি পূর্বাভাস সম্ভব, ( অর্থাত্ পর্যালোচনাগুলির জন্য আউট-অফ-স্যাম্পল পূর্বাভাস সহ সম্পূর্ণ ব্যাখ্যামূলক ভেরিয়েবল রয়েছে তবে নির্ভরশীল ভেরিয়েবলটি অনুপস্থিত ছিল।

আমি মূল ডাটাবেসে পূর্বাভাসযুক্ত ও অবশিষ্টাংশগুলি পরিবর্তন করতে সিবাইন্ড ব্যবহার করি।

## 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)))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.