1

我有一个无序分类变量(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 ...模型。

4

2 回答 2

3

在基础 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 参数。有了这个,我相信这些名字将被保留

于 2021-04-17T00:49:13.470 回答
1

我不知道这是否会让你开心,但就这样吧。

一个对重新排序有用的辅助函数:

match_pattern <- function(regex, target) {
    sapply(regex, function(x) {
        g <- grep(x,target)
        if (length(g)==0) return(NA)
        if (length(g)>1) stop("multiple matches")
        return(g)
    })
}

适合模型。在这里,我使用了这个forcats包,因为fct_relevel它对接受字符向量不那么挑剔(即我不需要relevel(factor(event_time), "Never").

m1 <- lm(yvar~event_time,
         data=transform(dd, event_time=forcats::fct_relevel(event_time,"Never")))

如果你喜欢 tidyverse,你可以让它紧凑一点:

dd %>% mutate(across(event_time, ~fct_relevel(.,"Never"))) %>%
     lm(formula=yvar~event_time)

现在texreg::screenreg(m1)实际上会按您喜欢的顺序(“未来”、“前”、“未知时间”)输出系数,因为它恰好是按字母顺序排列的。如果您想将订单更改为其他内容,您可以:

ref_order <-  c("(Intercept)", "Time unknown", "Future", "Pre")
pp <- match_pattern(ref_order,names(coef(m1)))
texreg::screenreg(m1, reorder.coef=pp)

虽然理论上可以在不接触数据集的情况下做你想做的事(通过设置自定义对比),但我认为这会相当困难。从长远来看,尝试在不采用其惯用语的情况下使用一种语言可能会很困难——您可能会尝试找出您不喜欢的因素并尝试解决它(该forcats软件包可能对某些任务有所帮助)。

于 2021-04-17T00:37:17.613 回答