2014-01-21 71 views
1

我有一个lm对象,想要得到用系数提取的公式。我知道如何在没有系数的情况下提取公式,以及如何在没有公式的情况下获得系数,但不知道如何获得系数。 Y〜10 + 1.25B,而不是Y〜B或什么拦截的表,B等等于从系数(l)中提取lm公式

这是我与当前正在使用的代码:

a = c(1, 2, 5) 
b = c(12, 15, 20) 

model = lm(a~b) 
summary(model) 
formula = formula(model) 
formula 
coefficients(model) 

我想什么从上面得到的是Y〜-5.326 + .51b

感谢

编辑:在我实际的代码,我有超过63预测和18款不同的工作,所以我喜欢的东西,可以扩展没有太多的工作。

+0

如果添加第二个预测器,代码将自动将其添加到公式中。试试看。 – lukeA

+0

哦,我以为我第一次看到它时就试过了,但我忘了编辑实际的模型。干杯:-) – user3051065

回答

7
as.formula(
    paste0("y ~ ", round(coefficients(model)[1],2), " + ", 
    paste(sprintf("%.2f * %s", 
        coefficients(model)[-1], 
        names(coefficients(model)[-1])), 
      collapse=" + ") 
) 
) 
# y ~ -5.33 + 0.51 * b 
+3

嗨,这适用于我提供的代码,所以谢谢。我想知道是否有一种方法可以更容易扩展?就像我添加第二个预测变量c一样,我假设我需要增加另外一两行来告诉它抓取相关位,这对于大多数模型来说可能会有30个预测变量,我不完全确定我在哪里放置它,对r仍然是新的,所以这段代码对我来说有点不透明)。 – user3051065

+0

@ user3051065我对您的可伸缩性问题做了一个新的回答。见下文。 –

4

我可能会提出修改建议,以lukeA的出色答卷:

as.formula(
    paste0("y ~ ", round(coefficients(model)[1],2), "", 
    paste(sprintf(" %+.2f*%s ", 
        coefficients(model)[-1], 
        names(coefficients(model)[-1])), 
      collapse="") 
) 
) 

这将确保负系数正确打印

假设你登陆了对于b系数为负,则输出将是

# y ~ -5.33 + -0.51 * b 

而不是

# y ~ -5.33 - 0.51 * b 
1

我想出了一种通用的方法来创建使用替换系数的模型公式。它比手动构建字符串paste0更灵活多变。

例如

我已经有优化的系数的模型:

> model 
Nonlinear regression model 
    model: players ~ pop * (decay^days_from_start) + ycept 
    data: data 
     pop  decay  ycept 
6.896e+06 2.633e-01 4.300e+05 
residual sum-of-squares: 1.64e+08 

Number of iterations to convergence: 12 
Achieved convergence tolerance: 1.49e-08 

这些是系数:

> coef(model) 
     pop  decay  ycept 
6.896421e+06 2.632545e-01 4.300453e+05 

全部放在一起:

> newFormula = as.formula(substituteDirect(formula(model), as.list(coef(model)))) 
> newFormula 
players ~ 6896421.4399627 * (0.263254460933212^days_from_start) + 430045.26142703