【问题标题】:How does lm() know which predictors are categorical?lm() 如何知道哪些预测变量是分类的?
【发布时间】:2017-07-17 17:25:11
【问题描述】:

通常,我和你(假设你不是机器人)很容易识别预测变量是分类还是定量。例如,性别显然是分类的。您的最后一票可以分类。
基本上,我们可以轻松识别分类预测变量。但是当我们在R 中输入一些数据时会发生什么,它的lm 函数会为预测器生成虚拟变量?它是如何做到的?

在 StackOverflow 上有点 related Question

【问题讨论】:

    标签: r regression


    【解决方案1】:

    搜索 R factor 函数。这是一个小演示,第一个模型使用气缸数作为数值。第二个模型将其用作分类变量。

    > summary(lm(mpg~cyl,mtcars))
    
    Call:
    lm(formula = mpg ~ cyl, data = mtcars)
    
    Residuals:
        Min      1Q  Median      3Q     Max 
    -4.9814 -2.1185  0.2217  1.0717  7.5186 
    
    Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
    (Intercept)  37.8846     2.0738   18.27  < 2e-16 ***
    cyl          -2.8758     0.3224   -8.92 6.11e-10 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    Residual standard error: 3.206 on 30 degrees of freedom
    Multiple R-squared:  0.7262,    Adjusted R-squared:  0.7171 
    F-statistic: 79.56 on 1 and 30 DF,  p-value: 6.113e-10
    
    > summary(lm(mpg~factor(cyl),mtcars))
    
    Call:
    lm(formula = mpg ~ factor(cyl), data = mtcars)
    
    Residuals:
        Min      1Q  Median      3Q     Max 
    -5.2636 -1.8357  0.0286  1.3893  7.2364 
    
    Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
    (Intercept)   26.6636     0.9718  27.437  < 2e-16 ***
    factor(cyl)6  -6.9208     1.5583  -4.441 0.000119 ***
    factor(cyl)8 -11.5636     1.2986  -8.905 8.57e-10 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    Residual standard error: 3.223 on 29 degrees of freedom
    Multiple R-squared:  0.7325,    Adjusted R-squared:  0.714 
    F-statistic:  39.7 on 2 and 29 DF,  p-value: 4.979e-09
    

    【讨论】:

    • 如果列是字符或因子,lm 会将其视为分类并创建虚拟编码。如果列是数字或整数,lm 会将其视为数字。例如,您可以使用Carseats$ShelveLoc = as.character(Carseats$ShelveLoc)Carseats$Age = as.character(Carseats$Age) 等进行检查,然后查看这些变量在lm 模型中与原始编码相比的处理方式。
    • 或者,如果您想查看进入模型的实际数据编码,请执行 model.matrix(Sales ~ Age + ShelveLoc, data=Carseats) 并查看当您更改 AgeShelveLoc 的类时它如何变化。 lm 调用 model.matrix 生成用于拟合模型的预测变量矩阵。
    • 在将Auto.data 保存为文件之前,您是否向horsepower 添加了一些"?" 值,因为所有值都是本机数据框中的整数?只有在保存之前将字符串值添加到Auto$horsepower 的至少一行,我才能重现该行为。
    • 您会看到这种行为,因为在第一种情况下,horsepower 中的所有 "?" 值都将转换为 NA,其余值是数字,因此结果列被解析为数字.在第二种情况下,horsepower 中至少有一个非数字值,因此 R 将该列视为一列字符串。但是read.table 的(烦人的)默认行为是将字符串转换为因子类。如果将参数stringsAsFactors=FALSE 添加到read.table,则第二种情况将导致horsepower 成为character 类而不是factor
    • read.table 如何确定哪些列是因子、字符或数字是与lm 如何处理这些列类不同的问题。对于给定的列类(数值、因子等),lm 的行为将是相同的,无论该列为何或如何恰好具有该特定类。
    【解决方案2】:

    Hxd1011 解决了更困难的情况,当一个分类变量存储为一个数字,因此 R 默认理解它是一个数值 - 如果这不是我们想要的行为,我们必须使用 factor 函数。

    您在数据集Carseats 中使用预测器ShelveLoc 的示例更容易,因为它是一个文本(字符)变量,因此它只能是一个分类变量。

    > head(Carseats$ShelveLoc)
    [1] Bad    Good   Medium Medium Bad    Bad   
    Levels: Bad Good Medium
    

    【讨论】:

      【解决方案3】:

      R 根据特征类型决定那个东西。您可以使用 str(dataset) 进行检查。如果特征是因子类型,那么它将为该特征创建假人。

      【讨论】:

        猜你喜欢
        • 2019-06-22
        • 1970-01-01
        • 1970-01-01
        • 2022-10-23
        • 2019-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-26
        相关资源
        最近更新 更多