【问题标题】:How to set all coefficients to one in model?如何在模型中将所有系数设置为一个?
【发布时间】:2021-07-17 16:28:51
【问题描述】:

要将回归中的某个系数固定为一个,我们可以使用offset 函数。

我想将所有系数设置为 1。

我们来看这个例子:

set.seed(42)
y <- rnorm(100)
df <- data.frame("Uni" = runif(100), "Exp" = rexp(100), "Wei" = rweibull(100, 1))
lm(y~ offset(2*get("Uni")) + Exp + Wei, data = df)

Call:
lm(formula = y ~ offset(Uni) + offset(Exp) + offset(Wei), data = df)

Coefficients:
(Intercept)  
     -2.712  

此代码有效,但是如果我有大量数据怎么办? 800 个变量,我想为所有变量做些什么?写下他们所有的名字不会那么有效。有什么解决方案可以让我们做得更棘手吗?

【问题讨论】:

  • 您可以在循环中定义公式
  • 为什么要使用回归?你可以计算一个总和。

标签: r model regression


【解决方案1】:

1) 术语/更新 以下单行语句将生成指定的公式。

update(formula(terms(y ~ ., data = df)), ~ offset(.))
## y ~ offset(Uni + Exp + Wei)

2) 重新制定/sprintf 另一种方法是:

reformulate(sprintf("offset(%s)", names(df)), "y")
## y ~ offset(Dep) + offset(Uni) + offset(Exp) + offset(Wei)

3) rowSums 另一种方法是简单地对每一行求和:

lm(y ~ offset(rowSums(df)))

4) lm.fit 我们可以使用 lm.fit 在这种情况下我们不需要公式:

lm.fit(cbind(y^0), y, offset = rowSums(df))

5) 意思如果你只需要系数那么它就是:

mean(y - rowSums(df))

【讨论】:

    【解决方案2】:

    如果我们这样做,我想我找到了一种解决方案:

    set.seed(42)
    # Assign everything to one data frame 
    df <- data.frame("Dep" = rnorm(100), "Uni" = runif(100),
                     "Exp" = rexp(100), "Wei" = rweibull(100, 1))
    varnames <- names(df)[-1]
    # Create formula for the sake of model creation
    form <- paste0("offset","(",varnames, ")",collapse = "+")
    form <- as.formula(paste0(names(df)[1], "~", form))
    lm(form, data = df)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 2014-02-04
      • 2021-04-08
      • 1970-01-01
      相关资源
      最近更新 更多