强制某些参数在lm()中具有正系数 [英] Force certain parameters to have positive coefficients in lm()
问题描述
我想知道如何约束 lm()
中的某些参数以使其具有正系数.有一些软件包或函数(例如 display
)可以使所有系数和截距为正.
I would like to know how to constrain certain parameters in lm()
to have positive coefficients. There are a few packages or functions (e.g. display
) that can make all coefficients, and the intercept, positive.
例如,在此示例中,我只想强制 x1
和 x2
具有正系数.
For instance, in this example, I would like to force only x1
and x2
to have positive coefficients.
x1=c(NA,rnorm(99)*10)
x2=c(NA,NA,rnorm(98)*10)
x3=rnorm(100)*10
y=sin(x1)+cos(x2)-x3+rnorm(100)
lm(y~x1+x2+x3)
Call:
lm(formula = y ~ x1 + x2 + x3)
Coefficients:
(Intercept) x1 x2 x3
-0.06278 0.02261 -0.02233 -0.99626
我在包 nnls
中尝试了函数 nnnpls()
,它可以轻松控制系数符号.不幸的是,由于数据中 NA
的问题,我无法使用它,因为此功能不允许 NA
.
I have tried function nnnpls()
in package nnls
, it can control the coefficient sign easily. Unfortunately I can't use it due to issues with NA
s in the data as this function doesn't allow NA
.
我看到函数 glmc()
可以用于施加约束,但是我无法使其正常工作.
I saw function glmc()
can be used to apply constraints but I couldn't get it working.
有人可以让我知道我该怎么办吗?
Could someone let me know what should I do?
推荐答案
为此,您可以使用软件包 colf
.目前,它提供了两个最小二乘非线性优化器,即 nls
或 nlxb
:
You could use the package colf
for this. It currently offers two least squares non linear optimizers, namely nls
or nlxb
:
library(colf)
colf_nlxb(y ~ x1 + x2 + x3, data = DF, lower = c(-Inf, 0, 0, -Inf))
#nlmrt class object: x
#residual sumsquares = 169.53 on 98 observations
# after 3 Jacobian and 3 function evaluations
# name coeff SEs tstat pval gradient JSingval
#1 param_X.Intercept. -0.0066952 NA NA NA 3.8118 103.3941
#2 param_x1 0.0000000 NA NA NA 103.7644 88.7017
#3 param_x2 0.0000000 NA NA NA 0.0000 9.8032
#4 param_x3 -0.9487088 NA NA NA 330.7776 0.0000
colf_nls(y ~ x1 + x2 + x3, data = DF, lower = c(-Inf, 0, 0, -Inf))
#Nonlinear regression model
# model: y ~ param_X.Intercept. * X.Intercept. + param_x1 * x1 + param_x2 *
# x2 + param_x3 * x3
# data: model_ingredients$model_data
#param_X.Intercept. param_x1 param_x2 param_x3
# -0.0392 0.0000 0.0000 -0.9801
# residual sum-of-squares: 159
#
#Algorithm "port", convergence message: both X-convergence and relative convergence (5)
您可以设置下
和/或上
边界,以根据需要为每个系数指定极限.
You can set the lower
and/or upper
bounds to specify the limits as you like for each one of the coefficients.
这篇关于强制某些参数在lm()中具有正系数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!