带约束的线性模型

机器算法验证 r 回归 对比
2022-03-14 09:19:08

我对 R 很陌生,我有以下问题:

我有一个简单的 2 因子线性模型:

# factor1 has 8 categorical values, factor2 has 6 categories
Rate ~ factor1 + factor2 
model1 <- lm(Rate~factor1+factor2, data=myData)

并且想要将factor1系数的约束SUM = 0,对于factor2也是如此。

没有任何手册提供任何线索如何做到这一点。

我在这里找到了类似问题的链接,但它有所不同,我无法弄清楚如何修改它......

4个回答

这里有个窍门。为简单起见,假设您正在尝试构建表单的模型

y=b1x1+b2x2+b3x3,
受制于b1+b2+b3=0. 只需重新表达b3作为b3=b1b2,也就是说您正在尝试构建表单的模型
y=b1x1+b2x2(b1+b2)x3=b1(x1x3)+b2(x2x3).
所以创建新变量x~1=x1x3,x~2=x2x3,并使用这些转换后的变量作为自变量执行回归。

您应该能够独立地将此技巧应用于factor1和的类别factor2(我假设数据以 0/1 指标表示各个类别的成员资格。)

您可以使用对比来做到这一点:

options(contrasts=c('contr.sum', 'contr.sum'))

有关?contr.sum更多信息,请参阅。

更新:稍微谷歌搜索会显示一个可能更清晰的页面:

最简单的是使用适当的内置函数

myContrasts <- list(factor1=contr.sum(length(levels(factor1))),
                    factor2=contr.sum(length(levels(factor2))))

model1 <- lm(Rate ~ factor1 + factor2, data=myData, contrasts=myContrasts)

有它的软件包。

一个例子是glmc - 受约束的广义线性模型。

请参阅此处的文档:http: //cran.r-project.org/web/packages/glmc/glmc.pdf

关于使用约束的优化技术的一个很好的概述可以在这里找到:http: //zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html

示例代码(来自 glmc 文档):

library(glmc)
#Specify the data.
n <- rbind(c(5903,230),c(5157,350))
mat <- matrix(0,nrow=sum(n),ncol=2)
mat <- rbind(matrix(1,nrow=n[1,1],ncol=1)%*%c(0,0),
matrix(1,nrow=n[1,2],ncol=1)%*%c(0,1),
matrix(1,nrow=n[2,1],ncol=1)%*%c(1,0),
matrix(1,nrow=n[2,2],ncol=1)%*%c(1,1))
#Specifying the population constraints.
gfr <- .06179*matrix(1,nrow=nrow(mat),ncol=1)
g <- matrix(1,nrow=nrow(mat),ncol=1)

amat <- matrix(mat[,2]*g-gfr,ncol=1)

hrh <- data.frame(birth=mat[,2], child=mat[,1], constraints=amat)
gfit <- glmc(birth~child, data=hrh, family="binomial",emplik.method="Owen",
control=glmc.control(maxit.glm=10,maxit.weights=200,
itertrace.weights=TRUE,gradtol.weights=10^(-6)))
summary.glmc(gfit)