R语言str()与head()输出不一致的疑问及逻辑回归影响咨询
问题
数据集birth.csv是1986年美国斯普林菲尔德贝斯州医学中心收集的,使用read.csv()并指定colClasses导入该CSV文件后,出现str()函数输出与head()函数输出不匹配的情况:例如low列的前6个值在head()中显示为0,但str()的输出里该列对应的数值是1。相关输出如下:
str()输出
'data.frame': 189 obs. of 9 variables: $ low : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... # 这里为什么不是0 0 0 0...? $ age : num 19 33 20 21 18 21 22 17 29 26 ... $ lwt : num 182 155 105 108 107 124 118 103 123 113 ... $ race : Factor w/ 3 levels "1","2","3": 2 3 1 1 1 3 1 3 1 1 ... $ smoke: Factor w/ 2 levels "0","1": 1 1 2 2 2 1 1 1 2 2 ... $ ptl : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... $ ht : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... $ ui : Factor w/ 2 levels "0","1": 2 1 1 2 2 1 1 1 1 1 ... $ ftv : Factor w/ 3 levels "0","1","2": 1 3 2 3 1 1 2 2 2 1 ...
head()输出
A data.frame: 6 × 9 low age lwt race smoke ptl ht ui ftv <fct><dbl><dbl><fct><fct><fct><fct><fct><fct> 1 0 19 182 2 0 0 0 1 0 2 0 33 155 3 0 0 0 0 2 3 0 20 105 1 1 0 0 0 1 4 0 21 108 1 1 0 0 1 2 5 0 18 107 1 1 0 0 1 0 6 0 21 124 3 0 0 0 0 0
请问这是什么原因?若基于该导入数据集构建逻辑回归模型,结果是否会出错?
原因分析
这是R语言中因子(Factor)类型的特性导致的:
- 因子在内部是以整数形式存储的,
str()输出里的数字(比如low列的1)是该因子对应的整数编码,而非实际显示的标签值。 - 因子的整数编码由标签的排序结果分配:以
low列为例,因子的两个水平是"0"和"1",排序后"0"作为第一个水平,对应整数1;"1"作为第二个水平,对应整数2。因此head()里显示的0,在str()中会以整数1的形式体现。 - 类似的,
ui列head()第一行显示1,对应str()里的2,是因为"1"是该因子的第二个水平,对应整数编码2。
对逻辑回归模型的影响
不会导致模型结果出错:
- R在拟合逻辑回归(比如使用
glm()函数并指定family = binomial)时,会自动识别因子的标签与编码的对应关系,模型计算基于因子的实际含义(标签值)进行,而非直接使用内部整数编码。 - 唯一需要注意的是,二分类因子的参考水平默认是排序后的第一个水平(此处
low列的参考水平为"0"),若需调整参考水平,可通过relevel()函数修改;即使不修改,也仅会改变模型系数的解释方向,不会影响模型的预测能力与整体有效性。
内容的提问来源于stack exchange,提问作者Nemo
相关产品推荐
相关产品推荐

