【问题标题】:specifying a regression in R with an indicator variable在 R 中使用指示变量指定回归
【发布时间】:2013-01-28 19:23:14
【问题描述】:

我想在 R 中指定一个回归,以估计 x 上的系数,这些系数取决于第三个变量 z,大于 0。例如

y ~ a + x*1(z>0) + x*1(z<=0)

在 R 中使用公式执行此操作的正确方法是什么?

【问题讨论】:

  • @liuminzhao:我认为这不能回答问题。将 z 设置为一个因素将不允许您进行这种条件回归。
  • @DavidRobinson 谢谢,我误解了 op 的问题。也许创建 2 个新的协变量,例如 x1 = x*I(z&gt;0)x2 = x*I(z&lt;=0)

标签: r formula regression


【解决方案1】:

“:”(冒号)运算符用于构造条件交互(当与使用I 构造的不相交预测器一起使用时)。应与预测一起使用

> y=rnorm(10)
> x=rnorm(10)
> z=rnorm(10)
> mod <- lm(y ~ x:I(z>0) )
> mod

Call:
lm(formula = y ~ x:I(z > 0))

Coefficients:
    (Intercept)  x:I(z > 0)FALSE   x:I(z > 0)TRUE  
      -0.009983        -0.203004        -0.655941  

> predict(mod, newdata=data.frame(x=1:10, z=c(-1, 1)) )
         1          2          3          4          5          6          7 
-0.2129879 -1.3218653 -0.6189968 -2.6337471 -1.0250057 -3.9456289 -1.4310147 
         8          9         10 
-5.2575108 -1.8370236 -6.5693926 
> plot(1:10, predict(mod, newdata=data.frame(x=1:10, z=c(-1)) )  )
> lines(1:10, predict(mod, newdata=data.frame(x=1:10, z=c(1)) ) )

可能有助于查看其模型矩阵:

> model.matrix(mod)
   (Intercept) x:I(z > 0)FALSE x:I(z > 0)TRUE
1            1      -0.2866252     0.00000000
2            1       0.0000000    -0.03197743
3            1      -0.7427334     0.00000000
4            1       2.0852202     0.00000000
5            1       0.8548904     0.00000000
6            1       0.0000000     1.00044600
7            1       0.0000000    -1.18411791
8            1       0.0000000    -1.54110256
9            1       0.0000000    -0.21173300
10           1       0.0000000     0.17035257
attr(,"assign")
[1] 0 1 1
attr(,"contrasts")
attr(,"contrasts")$`I(z > 0)`
[1] "contr.treatment"

【讨论】:

    【解决方案2】:
      y <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
      z <- sample(x=-10:10,size=length(trt),replace=T)
      x <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
      a <- rnorm(n=length(x))
      lm(y~a+I(x*1*I(z>0))+ I(x*1*I(z<=0)))
    

    但我认为在 DWIN 解决方案中使用 : 运算符更优雅..

    编辑

    lm(y~a+I(x*1*I(z>0))+ I(x*1*I(z

    呼叫:

    lm(formula = y ~ a + I(x * 1 * I(z > 0)) + I(x * 1 * I(z <= 0)))
    
    Coefficients:
             (Intercept)                     a   I(x * 1 * I(z > 0))  I(x * 1 * I(z <= 0))  
                  6.5775               -0.1345               -0.3352               -0.3366  
    
    > lm(formula = y ~ a+ x:I(z > 0))
    
    Call:
    lm(formula = y ~ a + x:I(z > 0))
    
    Coefficients:
        (Intercept)                a  x:I(z > 0)FALSE   x:I(z > 0)TRUE  
             6.5775          -0.1345          -0.3366          -0.3352  
    

    【讨论】:

    • 我认为y ~ x*I(z&gt;0) 可能会给出您的构造产生的结果,但我认为这不是 OP 所期望的。它提供了一个额外的拦截项。
    • @DWin 对。我可以将其简化为lm(y~a+I(x*I(z&gt;0))+ I(x*I(z&lt;=0))),但是当我将我的解决方案与它进行比较时,会得到相同的结果。
    • 两者都给出了一个无关项,但它们是不同的系数。我不清楚任何一个都可以称为正确,正确性取决于预测,但易于理解取决于系数是否具有作为斜率的自然解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2020-09-07
    • 2015-10-28
    • 2020-03-15
    • 2016-02-23
    相关资源
    最近更新 更多