2013-01-03 37 views
4

我目前正試圖在包含一些缺失值(NA)的數據集上構建LDA模型。例如,我想說明NA值的意思。據我所知,我可以在ldapredict函數中設置na.action=na.omit函數,這將刪除構建模型時的觀察結果,並在進行預測時強制返回NAR的自定義na.action

my.dat <- as.data.frame(cbind(
    c(0, 1, 0, 1, 1, 0), 
    c(5, 8, 9, 1, -1, NA), 
    c(-2.4, -4.0, -4.4, -0.5, 0.7, -0.3) 
)) 
mod <- lda(my.dat[,-1], my.dat[,1], na.action=na.omit) 
predict(mod, my.dat[,-1], na.action=na.omit) 

但我現在想要說明的方法,我有一個NA價值。所以,我可以定義我自己的na.impute函數。但是,我無法理解傳遞給此函數的內容以及我需要返回的內容。

na.impute <- function (object) { 
    print(object) 
    object 
} 

這給了我輸出:

[1] g x 
<0 rows> (or 0-length row.names) 

這沒有多大意義的我。我無法在文檔中找到任何指導。 object究竟是什麼,我該如何操作它來覆蓋NA值?

+0

@阿倫,它來自MASS包。 – Brendon

+0

有什麼我可以添加的? – Julius

+0

@Julius,你的回答非常有幫助。謝謝。 – Brendon

回答

2

這裏是如何找出什麼是object第一種方式:

na.impute <- function (object) { 
    browser() 
    print(object) 
    object 
} 

lda(my.dat[,-1], my.dat[,1], na.action=na.impute) 
# Called from: na.action(structure(list(g = grouping, x = x), class = "data.frame")) 
Browse[1]> str(object) 
# 'data.frame': 0 obs. of 2 variables: 
# $ g: num 0 1 0 1 1 0 
# $ x: matrix [1:6, 1:2] 5 8 9 1 -1 NA -2.4 -4 -4.4 -0.5 ... 
# ..- attr(*, "dimnames")=List of 2 
# .. ..$ : NULL 
# .. ..$ : chr "V2" "V3" 
Browse[1]> object$g 
# [1] 0 1 0 1 1 0 
Browse[1]> object$x 
#  V2 V3 
# [1,] 5 -2.4 
# [2,] 8 -4.0 
# [3,] 9 -4.4 
# [4,] 1 -0.5 
# [5,] -1 0.7 
# [6,] NA -0.3 
# attr(,"class") 
# [1] "matrix" 

所以這確實是一個不尋常的對象:structure(list(g = grouping, x = x), class = "data.frame")。另一種方式看到這一點,讓我們檢查功能lda

lda 
# function (x, ...) 
# UseMethod("lda") 
# <bytecode: 0x0e3583fc> 
# <environment: namespace:MASS> 
methods(lda) 
# [1] lda.collapsed.gibbs.sampler lda.data.frame*    lda.default*    
# [4] lda.formula*    lda.matrix*     
# 
# Non-visible functions are asterisked 

在這種情況下,我們感興趣的是lda.data.frame。既然是星號,我們可以選擇使用MASS:::lda.data.framegetAnywhere("lda.data.frame")看到源代碼:

function (x, ...) 
{ 
    res <- lda(structure(data.matrix(x), class = "matrix"), ...) 
    cl <- match.call() 
    cl[[1L]] <- as.name("lda") 
    res$call <- cl 
    res 
} 
<bytecode: 0x067c3248> 
<environment: namespace:MASS> 

現在我們可以看到,lda.matrix是必要的,所以再次使用的兩種功能之一:

function (x, grouping, ..., subset, na.action) 
{ 
    if (!missing(subset)) { 
     x <- x[subset, , drop = FALSE] 
     grouping <- grouping[subset] 
    } 
    if (!missing(na.action)) { 
     dfr <- na.action(structure(list(g = grouping, x = x), 
      class = "data.frame")) 
     grouping <- dfr$g 
     x <- dfr$x 
    } 
    res <- lda.default(x, grouping, ...) 
    cl <- match.call() 
    cl[[1L]] <- as.name("lda") 
    res$call <- cl 
    res 
} 
<bytecode: 0x067bf7b8> 
<environment: namespace:MASS> 

而且最後在這裏我們找到na.action這是我們所期望的。現在,這是替換列NA值的函數是指:

na.impute <- function (object) { 
    temp <- object$x 
    k <- which(is.na(temp), arr.ind = TRUE) 
    temp[k] <- colMeans(temp, na.rm = TRUE)[k[, 2]] 
    structure(list(g = object$g, x = as.matrix(temp)), class = "data.frame") 
} 
lda(my.dat[,-1], my.dat[,1], na.action=na.impute) 
# Call: 
# lda(my.dat[, -1], my.dat[, 1], na.action = na.impute) 
# 
# Prior probabilities of groups: 
# 0 1 
# 0.5 0.5 
# 
# Group means: 
#   V2  V3 
# 0 6.133333 -2.366667 
# 1 2.666667 -1.266667 
# 
# Coefficients of linear discriminants: 
#   LD1 
# V2 -0.8155124 
# V3 -1.1614265 

現在考慮predictna.action它是不可用的選項:看到getAnywhere("predict.lda"),有沒有這種說法的使用。