4

我目前正在尝试在包含一些缺失 ( NA) 值的数据集上构建 LDA 模型。例如,我想估算值的平均值NA。据我了解,我可以设置and函数,na.action=na.omit这些函数将在构建模型时删除观察结果,并在进行预测时强制返回。ldapredictNA

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 值?

4

1 回答 1

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.frame查看getAnywhere("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"),没有使用此参数。

于 2013-01-03T21:54:46.963 回答