0

一个令人费解的问题,我不确定我是否尽可能简洁地表达它,但是......

我处于想要拟合多元广义线性模型的位置 - 由于我的模型的大小和复杂性,我不得不rxGlm()RevoScaleR包中使用而不是内置glm()函数。

重要的是模型中的每个因素都有我选择的参考水平,我relevel()当然可以使用它来设置。然而,这里令人讨厌的是因子水平被重新排序,因此它使 GLM 模型输出难以使用。出于演示目的,我希望能够在拟合模型后检索原始因子水平排序。

一个简单的例子:

library(RevoScaleR) # from Microsoft R Client

x <- data.frame(country = c("Australia", "Belgium", "Chile", "Belgium", "Belgium"),
                degree = c("Y", "Y", "N", "Y", "N"),
                salary = c(10000, 15000, 5000, 20000, 4000))

model <- rxGlm(salary ~ country + degree, data = x, dropFirst = TRUE)

model$coefficients

这给

(Intercept) country=Australia   country=Belgium     country=Chile    degree=N    degree=Y
      -3500                NA              7500              8500          NA       13500

这两个因素在这里按字母顺序排列,因此参考水平是country = Australia, degree = N。假设我希望我的参考水平为country = Belgium, degree = Y。我可以这样做,然后重新运行模型:

x$country <- relevel(x$country, ref = "Belgium")
x$degree <- relevel(x$degree, ref = "Y")

model <- rxGlm(salary ~ country + degree, data = x, dropFirst = TRUE)

model$coefficients

这现在给出了相同的模型,但呈现方式不同:

(Intercept)   country=Belgium country=Australia     country=Chile    degree=Y    degree=N 
      17500                NA             -7500              1000          NA      -13500 

这些是我想要的系数,但现在排序错误。有没有一种简单的方法可以使用我在命令之前的因子排序来重新排列这个项目relevel()

谢谢你。

4

1 回答 1

2

创建一个名称向量,然后使用这些名称索引您的系数。例如:

Names <- c(
  '(Intercept)',
  paste('country', sort(levels(x$country)), sep = '='),
  paste('degree', sort(levels(x$degree)), sep = '=')
)
coefs2 <- coefs[Names]

给出:

(Intercept) country=Australia   country=Belgium     country=Chile          degree=N          degree=Y 
      17500             -7500                NA              1000            -13500                NA 

使用:

coefs <- c(
  `(Intercept)` = 17500L, `country=Belgium` = NA, `country=Australia` = -7500L, 
  `country=Chile` = 1000L, `degree=Y` = NA, `degree=N` = -13500L
)
于 2020-01-04T00:01:15.330 回答