gpt4 book ai didi

如果数字的主要影响来自函数,R 不会忽略与数字交互的基本水平

转载 作者:行者123 更新时间:2023-12-01 08:03:18 25 4
gpt4 key购买 nike

我知道这个问题可以通过生成预先计算的转换来规避,但我真的很想使用 R 的公式功能。这是我的问题的一个可重现的例子:

生成(相关的)玩具数据:

set.seed(123)
test<-data.frame(x=rnorm(100,1,.5),z=factor(sample(c('a','b','c'),100,T)))
test$y<-.3*test$x+0*(test$z=='a')-.07*(test$z=='b')-.15*(test$z=='c')+rnorm(100,0,.1)

运行线性模型:

> lm(y ~ x + z, test)
Call:
lm(formula = y ~ x + z, data = test)

Coefficients:
(Intercept) x zb zc
0.02453 0.27484 -0.08279 -0.12868

看起来不错。第一个因子水平 'a' 被省略了,就像它应该的那样。现在包括数字 x 和因子 z 之间的交互:

> lm(y ~ x + z + z:x, test)
Call:
lm(formula = y ~ x + z + z:x, data = test)

Coefficients:
(Intercept) x zb zc x:zb x:zc
0.037008 0.262650 -0.134938 -0.118896 0.049068 -0.009225
lm(y ~ poly(x,2) + z:x, test)

一切都还好。现在使用“poly”函数添加 x 的二次变换:

> lm(y ~ poly(x, 2) + z + z:x, test)

Call:
lm(formula = y ~ poly(x, 2) + z + z:x, data = test)

Coefficients:
(Intercept) poly(x, 2)1 poly(x, 2)2 zb zc za:x zb:x zc:x
0.33928 1.23017 -0.18029 -0.15478 -0.15574 -0.02749 0.04165 NA

就在这里。不是在交互项中排除 z 'a' 的第一级,而是将其包含在其他两个级别中。现在,za:x 是“别名”的,因为模型当然是单一的,包括所有三个因子水平。这很糟糕,因为像“car”包中的“vif”这样的函数不起作用:

> vif(lm(y ~ poly(x,2) + z + z:x, test))
Error in vif.lm(lm(y ~ poly(x, 2) + z + z:x, test)) :
there are aliased coefficients in the model

我试过类似 y ~ poly(x,2) + z + z:poly(x,1) 或 y ~ poly(x,2) + z + relevel(z, ref='a'):x但似乎没有任何效果。这是一个错误还是有人可以解释这个结果?有没有办法避免这个问题并仍然按照我的预期方式使用公式功能?谢谢。

最佳答案

因为公式允许您使用任何函数,所以 R 无法知道哪些函数将返回等于等式中已有的其他值的值。不存在针对 poly() 的特殊编码。

如果你只想包含一个 x 和一个 x^2 项,你可以这样做

lm(formula = y ~ x + I(x^2) + z + z:x, data = test)

避免一起使用 poly()。您只需在构建公式时更加小心。

关于如果数字的主要影响来自函数,R 不会忽略与数字交互的基本水平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30157331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com