为阶乘变量 NAs 输入 NAs 并将它们转换为虚拟变量
Imputing NAs for factorial variables NAs & Converting them to dummy variables
我有一个数据框,其中一些变量(列)是阶乘的,而对于某些记录我有缺失值(NA)。
问题是:
阶乘变量中 replacing\imputing NA 的正确方法是什么?
例如具有 4 个级别的 VarX {"A"、"B"、"C"、"D"} - 替换 NA 的首选值是什么? A\B\C\D?也许只有 0?也许用这个变量观察的多数水平来估算?
如何根据对 1 的回答实施此类插补?
解决 1 和 2 后,我将使用以下内容为阶乘变量创建虚拟变量:
is.fact <- sapply(my_data, is.factor)
my_data.dummy_vars <- dummy.data.frame(my_data[, is.fact], sep = ".")
之后,如何用提取到 my_data.dummy_vars
中的虚拟变量替换 my_data
中的所有阶乘变量?
我的用例是之后计算主成分(这需要所有变量都有数值,因此是虚拟变量)
谢谢
虚拟变量是指零和一吗?这就是我的结构:
# 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
感谢您阐明您的意图 - 这真的很有帮助!以下是我的想法:
输入缺失数据是一个非常重要的问题,对于交叉验证的优秀人员来说可能是个好问题。这是一个只能由您(主题专家)在项目上下文中真正解决的问题。一个大问题是缺失值是随机缺失的,还是作为其他一些变量的函数缺失的,以及这些是观察到的还是未观察到的。如果您得出结论认为它们作为其他(观察到的)变量的函数而缺失,您甚至可以考虑使用基于模型的方法,也许使用 GLM。到目前为止最简单的方法(如果你没有很多缺失值)就是用 mydata2 <- mydata[!is.na(TheFactorInQuestion),]
之类的东西删除这些行我再说一遍,缺失数据的插补是一个不平凡的问题,应该在上下文中仔细考虑。也许一个好的方法是尝试一些插补方法,看看你的推论是否(以及如何)发生变化。如果它们没有(很大)改变,您就会知道您不必担心。
删除行可以用一个相当简单的 mydata2 <- mydata[!is.na(TheFactorInQuestion),]
来完成。如果您进行任何其他形式的插补(从某种意义上说,"making up" 数据),我主张在得出结论认为这是正确的决定之前,要仔细考虑一下。当然,也有可能。
使用 cbind 连接两个 data.frames 非常简单,类似于 my_data2 <- cbind(my_data, my_data.dummy_vars)
。如果您需要删除包含因子数据的列,my_data3 <- my_data2[,-5]
例如,如果因子数据在第 5 列中。
我有一个数据框,其中一些变量(列)是阶乘的,而对于某些记录我有缺失值(NA)。
问题是:
阶乘变量中 replacing\imputing NA 的正确方法是什么?
例如具有 4 个级别的 VarX {"A"、"B"、"C"、"D"} - 替换 NA 的首选值是什么? A\B\C\D?也许只有 0?也许用这个变量观察的多数水平来估算?
如何根据对 1 的回答实施此类插补?
解决 1 和 2 后,我将使用以下内容为阶乘变量创建虚拟变量:
is.fact <- sapply(my_data, is.factor) my_data.dummy_vars <- dummy.data.frame(my_data[, is.fact], sep = ".")
之后,如何用提取到
my_data.dummy_vars
中的虚拟变量替换my_data
中的所有阶乘变量?
我的用例是之后计算主成分(这需要所有变量都有数值,因此是虚拟变量)
谢谢
虚拟变量是指零和一吗?这就是我的结构:
# 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
感谢您阐明您的意图 - 这真的很有帮助!以下是我的想法:
输入缺失数据是一个非常重要的问题,对于交叉验证的优秀人员来说可能是个好问题。这是一个只能由您(主题专家)在项目上下文中真正解决的问题。一个大问题是缺失值是随机缺失的,还是作为其他一些变量的函数缺失的,以及这些是观察到的还是未观察到的。如果您得出结论认为它们作为其他(观察到的)变量的函数而缺失,您甚至可以考虑使用基于模型的方法,也许使用 GLM。到目前为止最简单的方法(如果你没有很多缺失值)就是用
mydata2 <- mydata[!is.na(TheFactorInQuestion),]
之类的东西删除这些行我再说一遍,缺失数据的插补是一个不平凡的问题,应该在上下文中仔细考虑。也许一个好的方法是尝试一些插补方法,看看你的推论是否(以及如何)发生变化。如果它们没有(很大)改变,您就会知道您不必担心。删除行可以用一个相当简单的
mydata2 <- mydata[!is.na(TheFactorInQuestion),]
来完成。如果您进行任何其他形式的插补(从某种意义上说,"making up" 数据),我主张在得出结论认为这是正确的决定之前,要仔细考虑一下。当然,也有可能。使用 cbind 连接两个 data.frames 非常简单,类似于
my_data2 <- cbind(my_data, my_data.dummy_vars)
。如果您需要删除包含因子数据的列,my_data3 <- my_data2[,-5]
例如,如果因子数据在第 5 列中。