2012-03-06 47 views
6

在以下示例中,假设您有一个模型,其中supp是因子变量。R公式和结果系数名称

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.GTothendieck提出的解决方案很好,但它实际上会产生错误的结果。以下示例显示了这一点:

# 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拥有missings意见。

对我来说,问题依然存在,是否有公式接口来处理这种情况,而不需要使用额外公式和提取可以“转换”的模型框架的烦人的中间步骤。

我希望问题很清楚。

回答

7

data=参数修改它,而不是在formula=说法:

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

尼斯,非常感谢! – Stefan 2012-03-06 15:08:36

+1

如果你喜欢它,它可以解决你的问题,你应该点击接受它... – 2012-03-06 17:31:28

+0

嗨,GG,虽然你的答案很好,并在许多情况下工作,它仍然可以给不希望的结果。我在编辑问题时做了一个例子。 – Stefan 2012-03-07 13:47:47