【问题标题】:Specifying linear model in R without an intercept with contrasts在 R 中指定线性模型,没有带对比的截距
【发布时间】:2019-06-12 21:10:06
【问题描述】:

我正在尝试在 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() 指定对比度?

【问题讨论】:

    标签: r linear-regression


    【解决方案1】:

    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,但类型仍然是一个因素。所以lm 将其视为一个因素,为您提供每个级别的系数。此外,提供contrast 或在lm 中调用attr 将引发错误。根据您希望最终的外观,您可能需要探索不同的包,例如 contrastlm 中还有一个 contrast 参数,但我不能 100% 确定这是您真正想要的。有关更多信息,请参阅?lm

    【讨论】:

    • 感谢您的回复。但是,我仍然对为什么在使用截距指定完整线性模型时对比度正常工作感到困惑?对比度似乎无法正常工作的唯一情况是没有截距的模型。
    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2015-10-28
    • 2013-08-12
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    相关资源
    最近更新 更多