首页 > 解决方案 > 使用 lm 更改分类变量和参考类别的顺序

问题描述

我有一个无序分类变量(event_time),它有 5 个不同的选项("future", "past", "prebirth", "never", "uncertain")作为预测变量,我想以某种方式指定"never"参考类别(理想情况下不转换变量)。我只是使用 lm 然后texreg::screenreg(list(m1, m2, m3)比较具有不同结果变量但具有相同预测变量的模型的输出。

如果有一种方法可以重新排列类别在模型中显示的顺序(可能在screenreg?),那就太好了。

如果这一切都可以在不处理转换和因子变量的情况下完成,还有一个额外的好处(如果变量已经是一个因子,我知道如何使用 relevel 来做到这一点)......非常感谢。

一些数据:

structure(list(yvar = c(4.43024525984776, -3.01051231657988, 
4.70993862460106, -2.03636967067474, -1.09802960848352, -1.16527740798651, 
5.6002805983151, -7.03524067599639, 1.02474010023752, 0.647438645180132
), event_time = c(NA, "Pre", "Future", "Time unknown", "Future", "Future", NA, 
"Never", NA, "Never"), race = c("Black", "Black", "White", "Black", 
"Black", "Black", "Black", "White", "Black", "White"), log_parent_income = c(4.0073333, 
NA, 3.8066626, 2.1972246, 0.69314718, 4.2484951, 3.9120231, 1.9459101, 
2.3025851, 3.8066626)), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

然后只是做一个简单的lm(yvar ~ event_time + log_parent_income + race ...模型。

标签: rtidyverselmtexreg

解决方案


在基础 R 中,您可以直接在线性回归上更改对比度

 lm(yvar ~ C(event_time, base = 2)+ log_parent_income + race, data = df)

也就是说,如果你知道你想要的基地。

如果您知道参考电平是最后一个,那么您可以执行以下操作:

 lm(yvar ~ event_time + log_parent_income + race, data = df, 
     contrasts = list(event_time = "contr.SAS"))

当然,这意味着如果您要对各种变量执行相同操作,只需更改选项:

 options(contrasts = rep("contr.SAS",2))
 lm(yvar ~ event_time + log_parent_income + race, data = df)

这是假设这Never是最后一个参考水平。您可以弄乱contr.treatment基本参数以将引用设置为您想要的任何数字

最后,您可以编写一个将基本参数作为字符串字符接收的函数:

C1 <- function (object, contr, how.many, ...) 
{
  base <- list(...)$base
  if(!is.null(base) &is.character(base))
      base <- match(base, levels(factor(object)))
  C(object, base = base)
}

然后您可以将其用作:

lm(yvar~C1(event_time, base = "Never"), df)

这还不够吗?您也可以通过提供一个函数来更改 contrasts 参数。有了这个,我相信这些名字将被保留


推荐阅读