【问题标题】:Is there a way to force the coefficient of the independent variable to be a positive coefficient in the linear regression model used in R?有没有办法强制自变量的系数在 R 中使用的线性回归模型中为正系数?
【发布时间】:2021-08-08 06:54:04
【问题描述】:

在 lm(y ~ x1 + x2+ x3 +...+ xn) 中,并非所有自变量都是正数。 例如,我们知道 x1 到 x5 必须有正系数,而 x6 到 x10 必须有负系数。 然而,当使用 R 执行 lm(y ~ x1 + x2+ x3 +...+ x10) 时,x1 ~ x5 中的一些具有负系数,而 x6 ~ x10 中的一些具有正系数。是数据分析结果。 我想用线性回归的方法来控制,有什么好的方法吗?

【问题讨论】:

标签: r lm


【解决方案1】:

系数的符号可能会根据其与其他系数的相关性而改变。正如@TarJae 所指出的,这似乎是(或对应于?)辛普森悖论的一个例子,它描述了相关符号可能反转的情况,具体取决于我们是否以另一个变量为条件。

这是一个具体示例,其中我创建了两个自变量 x1x2,它们都与 y 高度相关,但是当它们组合时,x2 的系数会反转符号:

# specially chosen seed; most seeds' result isn't as dramatic
set.seed(410)    
df1 <- data.frame(y  = 1:10,
                  x1 = rnorm(10, 1:10),
                  x2 = rnorm(10, 1:10))
lm(y ~ ., df1)

Call:
lm(formula = y ~ ., data = df1)

Coefficients:
(Intercept)           x1           x2  
    -0.2634       1.3990      -0.4792  

这个结果不是错误的,而是出现在这里(我认为)因为来自x1 的预测误差恰好与来自x2 的预测误差相关,因此通过减法 一些x2

编辑,补充分析:

您拥有的独立系列越多,您就越有可能看到这种现象出现。对于我只有两个系列的示例,从 1 到 1000 的整数种子中只有 2.4% 会产生这种现象,其中一个系列会产生负回归系数。三个系列增加至 16%,五个系列增加 64%,10 个系列增加 99.9%。

【讨论】:

    【解决方案2】:

    约束

    可能性包括使用:

    1. nls with algorithm = "port" 在这种情况下可以指定上限和下限。

    2. nnls 包中的 nnnpls 支持上限和下限 0,如果所有系数都应为非负数,则在同一包中使用 nnls。

    3. bvls 包中的 bvls(有界值最小二乘)并指定边界。

    4. 在 CVXR 包的小插图中有一个执行非负最小二乘的示例。

    5. 将其重新表述为二次规划问题(有关公式,请参阅Wikipedia)并使用 quadprog 包。

    6. 在 limSolve 包中的 nnls。对应该具有负系数的列求反,以将其转换为非负最小二乘问题。

    这些包大多没有公式接口,而是需要将模型矩阵和因变量作为单独的参数传递。如果 df 是包含数据的数据框,并且如果第一列是因变量,则可以使用以下方法计算模型矩阵:

    A <- model.matrix(~., df[-1])
    

    因变量是

    df[[1]]
    

    处罚

    另一种方法是对最小二乘目标函数添加惩罚,即目标函数变为残差平方和加上一个或多个附加项,这些附加项是系数和调整参数的函数。尽管这样做不会施加任何硬约束来保证所需的符号,但无论如何它可能会导致正确的符号。如果问题是病态的或者预测变量多于观察值,这将特别有用。

    1. ridge 包中的linearRidge 将最小化残差平方和加上等于 lambda 乘以系数平方和的惩罚。 lambda 是软件可以自动确定的标量调整参数。当 lambda 为 0 时,它减少到最小二乘。软件有公式方法,加上自动调整,特别好用。

    2. glmnet 添加包含两个调整参数的惩罚项。它包括最小二乘法和岭回归作为特例。它还支持系数的界限。有自动设置两个调整参数的工具,但它没有公式方法,并且过程不像 ridge 包中那样简单。阅读随附的小插曲以了解更多信息。

    【讨论】:

      【解决方案3】:

      1- 一种方法是定义优化程序并通过约束和限制最小化均方误差。 (nlminb、优化等) 2-另一个正在使用一个名为“lavaan”的库,如下所示:

      https://stats.stackexchange.com/questions/96245/linear-regression-with-upper-and-or-lower-limits-in-r

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-19
        • 2016-06-29
        • 2021-05-25
        • 2016-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多