具有分类和数值预测变量的多元回归

机器算法验证 r 广义线性模型
2022-03-17 03:37:40

我对 R 比较陌生,我正在尝试将模型拟合到由分类列和数字(整数)列组成的数据。因变量是一个连续数。

数据格式如下:

predCateg、predIntNum、ResponseVar

数据看起来像这样:

ranking, age_in_years, wealth_indicator
category_A, 99, 1234.56
category_A, 21, 12.34
category_A, 42, 234.56
....
category_N, 105, 77.27

我将如何在 R 中对此进行建模(大概是使用 GLM)?

[[编辑]]

我刚刚想到(在更彻底地分析数据之后),分类自变量实际上是有序的。因此,我将之前提供的答案修改如下:

> fit2 <- glm(wealth_indicator ~ ordered(ranking) + age_in_years, data=amort2)
> 
> fit2

Call:  glm(formula = wealth_indicator ~ ordered(ranking) + age_in_years, 
    data = amort2)

Coefficients:
      (Intercept)  ordered(ranking).L  ordered(ranking).Q  ordered(ranking).C      age_in_years  
        0.0578500         -0.0055454         -0.0013000          0.0007603          0.0036818  

Degrees of Freedom: 39 Total (i.e. Null);  35 Residual
Null Deviance:      0.004924 
Residual Deviance: 0.00012      AIC: -383.2
> 
> fit3 <- glm(wealth_indicator ~ ordered(ranking) + age_in_years + ordered(ranking)*age_in_years, data=amort2)
> fit3

Call:  glm(formula = wealth_indicator ~ ordered(ranking) + age_in_years + 
    ordered(ranking) * age_in_years, data = amort2)

Coefficients:
                    (Intercept)                ordered(ranking).L                ordered(ranking).Q  
                      0.0578500                       -0.0018932                       -0.0039667  
              ordered(ranking).C                    age_in_years  ordered(ranking).L:age_in_years  
                      0.0021019                        0.0036818                       -0.0006640  
ordered(ranking).Q:age_in_years  ordered(ranking).C:age_in_years  
                      0.0004848                       -0.0002439  

Degrees of Freedom: 39 Total (i.e. Null);  32 Residual
Null Deviance:      0.004924 
Residual Deviance: 5.931e-05    AIC: -405.4

我对输出中的 what和mean 感到有些困惑ordered(ranking).C希望能在理解此输出以及如何使用它来预测响应变量方面提供一些帮助。ordered(ranking).Qordered(ranking).L

2个回答

试试这个:

fit <- glm(wealth_indicator ~ 
           factor(ranking) + age_in_years + factor(ranking) * age_in_years)

factor()命令将确保 R 知道您的变量是分类的。如果您的类别由整数表示,这尤其有用,否则 glm 会将变量解释为连续的。

factor(ranking) * age_in_years术语让 R 知道您想要包含交互项。

我最近用序数自变量回答了连续因变量,推荐了包中的ordSmooth函数。ordPens这使用惩罚回归来平滑有序变量级别之间的虚拟系数,以使它们从一个级别到下一个级别的变化不会太大。例如,您可能不希望' 的系数与相比category_A有更大的不同您可能希望系数单调上升或下降,或者至少在等级之间逐渐变化。我对链接问题的回答列出了更多信息的参考资料。category_Bcategory_N

ordSmooth还可以容纳连续(和名义)变量;在您的情况下,代码可能是:

SmoothFit=with(amort2,
ordSmooth(as.numeric(ordered(ranking)),wealth_indicator,z=age_in_years,lambda=.001))

ordSmooth序数数据需要数字输入,因此需要as.numeric(ordered())重新格式化。z用于连续预测变量的数字向量/矩阵/ data.framelambda是平滑系数——较大的值会使你的系数更接近于零。从这里开始可能是明智的。打印SmoothFit会给你系数和拟合值,但恐怕剩下的就交给你了。

在您的方法中,ordered(ranking).C/ .Q/.L系数似乎分别标记为三次、二次和线性。如果你尝试glm(rnorm(10)~ordered(rep(1:5,2))),你也会得到一个系数ordered(rep(1:5, 2))^4我不太确定为什么这些用指数表示;我不认为它将这些建模为多项式项,因为系数不同,glm(y~x+I(x^2)+I(x^3)+I(x^4))并且缩放变体。它们应该是基本的虚拟代码