首页 > 解决方案 > 在 R 中指定线性模型,没有带对比的截距

问题描述

我正在尝试在 R 中运行一个未指定截距的线性模型。原因是最终计算添加截距时减少的平方和。但是,当使用内置因子对比指定此模型与明确说明对比值(即 -.5 和 .5)时,我收到了不同的结果。

更具体地说,contrasts()在具有 2 个项(无截距)的模型中使用结果,同时通过列向量明确说明对比度值会导致正确的模型(无截距和 1 个指定对比度的项)。

group <- rep(c("c", "t"), each = 5)
group_cont <- rep(c(-.5, .5), each = 5)
var1 <- runif(10)
var2 <- runif(10)

test_data <- data.frame(
  group = factor(group), 
  group_cont = group_cont,
  y = var1, 
  x = var2
  )
contrasts(test_data$group) <- cbind(grp = c(-.5, .5))

summary(lm(y ~ 1 + group, data = test_data))      # full model
summary(lm(y ~ 0 + group, data = test_data))      # weird results
summary(lm(y ~ 0 + group_cont, data = test_data)) # expected

有没有办法指定没有截距的线性模型,但仍用于contrasts()指定对比度?

标签: rlinear-regression

解决方案


lm()要求输入数据框和列名。当您使用 时contrasts(),您正在为数据框中的列分配一个属性,您可以使用contrast函数 或直接调用该属性attr。但是,您不会更改数据类型本身。使用上面的示例:

> str(test_data)
  'data.frame': 10 obs. of  4 variables:
 $ group     : Factor w/ 2 levels "c","t": 1 1 1 1 1 2 2 2 2 2 #### still a factor ####
  ..- attr(*, "contrasts")= num [1:2, 1] -0.5 0.5  #### NOTE The contrast attribute ####
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : chr  "c" "t"
  .. .. ..$ : chr "grp"
 $ group_cont: num  -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5
 $ y         : num  0.161 0.518 0.417 0.335 0.301 ...
 $ x         : num  0.34 0.729 0.766 0.629 0.191 ...

> attr(test_data$group, "contrasts")

   grp
c -0.5
t  0.5

所以attr添加了 a 但类型仍然是一个因素。因此lm将其视为一个因素,为您提供每个级别的系数。此外,提供contrast或调用attr内部lm会引发错误。根据您希望最终的外观,您可能需要探索不同的包,例如contrast。还有一个contrast论点,lm但我不是 100% 确定这是你真正想要的。有关?lm更多信息,请参阅。


推荐阅读