【问题标题】:Imputing NAs for factorial variables NAs & Converting them to dummy variables为阶乘变量 NA 估算 NA 并将它们转换为虚拟变量
【发布时间】:2017-02-24 16:48:43
【问题描述】:

我有一个数据框,其中一些变量(列)是阶乘,而对于某些记录我有缺失值 (NA)。

问题是:

  1. 在阶乘变量中替换\估算 NA 的正确方法是什么?

    例如,具有 4 个级别的 VarX {“A”、“B”、“C”、“D”} - 替换 NA 的首选值是什么? A B C D?也许只有0?也许用这个变量观察的大多数水平来估算?

  2. 如何根据对 1 的回答来实现这种插补?

  3. 一旦解决了 1&2,我将使用以下内容为阶乘变量创建虚拟变量:

    is.fact <- sapply(my_data, is.factor)
    my_data.dummy_vars <- dummy.data.frame(my_data[, is.fact], sep = ".")
    

    之后,如何将my_data 中的所有阶乘变量替换为我提取到my_data.dummy_vars 中的虚拟变量?

我的用例是事后计算主成分(这需要所有变量都有数值,因此是虚拟变量)

谢谢

【问题讨论】:

  • 您能否提供一个小例子来说明您拥有什么以及您期望什么?你打算如何对待NA?我不知道这是否是一个重复的问题,例如见this
  • 不确定我应该如何处理阶乘变量的 NA。在转换为虚拟变量之前用 0 替换它们是个好主意吗?如果是这样,我很乐意学习如何这样做
  • @DavidLeal 编辑后见我的帖子,我希望我的意图现在更清楚了。

标签: r dataframe dummy-variable


【解决方案1】:

感谢您阐明您的意图 - 这真的很有帮助!以下是我的想法:

  1. 估算缺失数据是一个重要的问题,对于交叉验证的优秀人员来说可能是一个好问题。这是一个只能由您(主题专家)在项目环境中真正解决的问题。一个大问题是缺失值是随机缺失还是作为其他一些变量的函数缺失,以及这些是观察到还是未观察到。如果您断定它们作为其他(观察到的)变量的函数而丢失,您甚至可以考虑使用基于模型的方法,也许使用 GLM。到目前为止,最简单的方法(如果您没有很多缺失值)是使用mydata2 &lt;- mydata[!is.na(TheFactorInQuestion),] 之类的内容删除这些行,我再说一遍,缺失数据的插补是一个不平凡的问题,应该考虑仔细并在上下文中。也许一个好方法是尝试一些插补方法,看看你的推论是否(以及如何)改变。如果他们没有(太多)改变,你就会知道你不需要担心。

  2. 可以使用相当简单的mydata2 &lt;- mydata[!is.na(TheFactorInQuestion),] 来代替删除行。如果您进行任何其他形式的插补(从某种意义上说,“编造”数据),我建议您在得出这是正确的决定之前仔细考虑这样做。当然,也有可能。

  3. 使用 cbind 连接两个 data.frame 非常简单,类似于 my_data2 &lt;- cbind(my_data, my_data.dummy_vars)。如果您需要删除包含因子数据的列,my_data3 &lt;- my_data2[,-5],例如,因子数据在第 5 列中。

【讨论】:

  • 谢谢!恐怕删除行不是我的选择(项目约束)。我将与交叉验证的人协商正确的方法 - 用 0 或多数值替换。您能帮忙编写这些代码吗? (将 NA 替换为 0 \ 与每个因素的多数级别)
  • 没关系,我被介绍到 R 中的 mice() 包,它似乎为我思考了每个缺失值列(简而言之......)。谢谢
【解决方案2】:

虚拟变量是指零和一吗?这就是我的结构:

# first building a fake data frame
x <- 1:10
y <- as.factor(c("A","A","B","B","C","C",NA,"A","B","C"))
df <- data.frame(x,y)

# creating dummy variables 
df$dummy_A <- 1*(y=="A")
df$dummy_B <- 1*(y=="B")
df$dummy_c <- 1*(y=="C")

# did it work?
df
    x    y dummy_A dummy_B dummy_c
1   1    A       1       0       0
2   2    A       1       0       0
3   3    B       0       1       0
4   4    B       0       1       0
5   5    C       0       0       1
6   6    C       0       0       1
7   7 <NA>      NA      NA      NA
8   8    A       1       0       0
9   9    B       0       1       0
10 10    C       0       0       1

【讨论】:

  • 我的意思是,例如,如果一个阶乘变量有 4 个级别,它将被 5 个虚拟变量替换
  • 为什么要换成5?第五个需要变量的情况是什么?
  • 据我了解,n 级变量使用 n+1 个虚拟变量表示
  • 我不明白你的意思。实际上,只需要 n-1 个变量就可以包含相同数量的信息。并且根据您正在进行的分析,为每个可能的因素水平编码一个变量(如上面建议的那样)可能会导致模型过度参数化
  • 我会尝试为我的评论找到参考。这实际上并不重要,因为我为此使用了假人库。我的问题是如何为某些记录预处理(如果有的话)包含 NA 的阶乘变量?在我使用虚拟库创建它们之后,hpw 用这些虚拟变量替换我数据中的实际阶乘变量?
猜你喜欢
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
相关资源
最近更新 更多