R公式和生成的系数名称

7
在下面的示例中,假设您有一个模型,其中supp是一个因子变量。
lm(len ~ dose + supp, data = ToothGrowth)

但是我想为因子使用不同的基准水平。我可以直接在公式中指定:

lm(len ~ dose + relevel(supp, "VC"), data = ToothGrowth)

输出结果如下:

Call:
lm(formula = len ~ dose + relevel(supp, "VC"), data = ToothGrowth)

Coefficients:
      (Intercept)                   dose  relevel(supp, "VC")OJ  
            5.573                  9.764                  3.700 

直接在公式中进行转换非常方便,而不需要生成中间数据集或更改现有的数据集。例如,当您使用scale对变量进行标准化时,在最终模型中必须考虑其他包含缺失值的变量。然而,通常输出中的系数名称变得相当丑陋。

我的问题是:在使用公式时,是否可以指定表达式结果中变量的名称?就像这样

lm(len ~ dose + (OJ = relevel(supp, "VC")), data = Toothgrowth)

(这个方法不起作用)。

编辑:虽然G.Grothendieck提出的解决方案很好,但实际上它产生了错误的结果。以下示例说明了这一点:

# Create some data:
df <- data.frame(x1 = runif(10), x2=runif(10))
df <- transform(df,   y = x1 + x2 + rnorm(10))

# Introduce some missings.
df$x1[2:3] <- NA

# The wrong result:
lm(formula = y ~ z1 + z2, 
   data    = transform(df, z1 = scale(x1), z2=scale(x2)))

# extract a model frame.
df2 <- model.frame(y ~ x1 + x2, df)

# The right result:
lm(formula = y ~ scale(x1) + scale(x2), 
   data    = df2)

# or:
lm(formula = y ~ z1 + z2, 
   data    = transform(model.frame(y ~ x1 + x2, df), 
             z1 = scale(x1), z2 = scale(x2)))

问题在于当降低 x2 的维度时,它使用的观测值不在最终模型中,因为 x1 存在缺失值。
所以对我来说,问题仍然存在,是否有一种方法让公式界面处理这种情况,而不必使用额外的公式和提取模型框架的烦人中间步骤,然后可以进行“转换”。
希望问题清楚明了。
1个回答

8

formula=参数中而不是data=参数中修改它:

lm(len ~ dose + OJ, data = transform(ToothGrowth, OJ = relevel(supp, "VC")))

你好,GG,虽然你的答案很棒,在许多情况下都能正常工作,但仍会导致意料之外的结果。我在问题编辑中提供了一个示例。 - Stefan
尝试使用以下代码:lm(formula = y ~ z1 + z2, data = transform(na.omit(df), z1 = scale(x1), z2 = scale(x2))) - G. Grothendieck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接