我对何时在R中使用
因子(教育)或因子(年龄组)感到非常困惑。它是否用于分类有序数据?或者我可以只使用没有层次结构的简单分类数据吗?
我知道这是非常基本的。我真的需要一些澄清。
我在这里并没有看到一个明确的问题,所以也许一个简单的例子就足够了。
假设我们有以下数据。
set1 <- c("AA", "B", "BA", "CC", "CA", "AA", "BA", "CC", "CC")
我们想考虑这些数据。
f.set1 <- factor(set1)
让我们看一下输出。请注意,R 只是按字母顺序排列了级别,但并没有说这意味着层次结构(请参阅"级别"行)。
f.set1
# [1] AA B BA CC CA AA BA CC CC
# Levels: AA B BA CA CC
is.ordered(f.set1)
# [1] FALSE
但是,对分解数据使用as.numeric
可能会欺骗您认为它是分层的。请注意,在下面的输出中,"5"在"4"之前,还要注意table(f.set1)
的字母顺序输出(如果您只是table(set1)
,也会发生这种情况。
as.numeric(f.set1)
# [1] 1 2 3 5 4 1 3 5 5
table(f.set1)
# f.set1
# AA B BA CA CC
# 2 1 2 1 3
现在让我们将其与使用ordered
参数和levels
参数时发生的情况进行比较。使用levels
加ordered = TRUE
告诉我们,此分类数据是分层的,按照levels
指定的顺序(而不是按字母顺序或我们输入数据的顺序)。
o.set1 <- factor(set1,
levels = c("CA", "BA", "AA", "CC", "B"),
ordered = TRUE)
即使查看输出,现在也向我们显示了层次结构。
o.set1
# [1] AA B BA CC CA AA BA CC CC
# Levels: CA < BA < AA < CC < B
is.ordered(o.set1)
# [1] TRUE
功能也是如此as.numeric
和table
.
as.numeric(o.set1)
# [1] 3 5 2 4 1 3 2 4 4
table(o.set1)
# o.set1
# CA BA AA CC B
# 1 2 2 3 1
因此,总而言之,factor()
本身本质上只是创建分类数据的非分层排序因子;factor()
levels
和ordered = TRUE
参数将创建分层类别。
或者,如果您直接想要创建有序因子,请使用ordered()
。仍然需要指定类别的顺序:
ordered(set1, levels = c("CA", "BA", "AA", "CC", "B"))
您可以通过使用ordered(x)
或factor(x, ordered=TRUE)
创建因子来按顺序标记因子。?factor
的"详细信息"部分解释说:
有序因子仅与其类中的因子不同,但 方法和模型拟合函数处理这两个类 完全不同。
您可以通过比较这两个对象的属性来确认该报价的第一部分(它们仅在类上有所不同):
f <- factor(letters[3:1], levels=letters[3:1])
of <- ordered(letters[3:1], levels=letters[3:1])
attributes(f)
# $levels
# [1] "c" "b" "a"
#
# $class
# [1] "factor"
attributes(of)
# $levels
# [1] "c" "b" "a"
#
# $class
# [1] "ordered" "factor"
然后,各种因子处理 R 函数(该报价第二部分的"方法和模型拟合函数")将使用is.ordered()
来测试该"ordered"
类指标是否存在,将其视为以不同于无序因子的方式处理有序因子的指令。 以下是几个示例:
## The print method for factors. (Type 'print.factor' to see the function's code)
print(f)
# [1] c b a
# Levels: c b a
print(of)
# [1] c b a
# Levels: c < b < a
## The contrasts function. (Type 'contrasts' to see the function's code.)
contrasts(of)
# .L .Q
# [1,] -7.071068e-01 0.4082483
# [2,] 4.350720e-18 -0.8164966
# [3,] 7.071068e-01 0.4082483
contrasts(f)
# b a
# c 0 0
# b 1 0
# a 0 1