虚拟变量作为没有截距的斜率变换器

时间:2016-04-14 19:01:45

标签: r dummy-variable

这是我第一次在这里问。

我只能生成斜率虚拟变量(没有拦截虚拟)。 但是,如果我将虚拟变量乘以自变量,如下所示, 表示斜率虚拟和截距虚拟结果。

我想仅合并斜率虚拟并排除拦截虚拟。

感谢您的帮助。 最好成绩, yjkim

reg <- lm(year ~ as.factor(age)*log(v1269)) 
Call: 
lm(formula = year ~ as.factor(age) * log(v1269)) 

Residuals: 
   Min     1Q Median     3Q    Max 
-6.083 -1.177  1.268  1.546  3.768 

Coefficients: 
                            Estimate Std. Error t value Pr(>|t|)   
(Intercept)                 5.18076    2.16089   2.398   0.0167 * 
as.factor(age)2             1.93989    2.75892   0.703   0.4821   
as.factor(age)3             2.46861    2.39393   1.031   0.3027   
as.factor(age)4            -0.56274    2.30123  -0.245   0.8069   
log(v1269)                 -0.06788    0.23606  -0.288   0.7737   
as.factor(age)2:log(v1269) -0.15628    0.29621  -0.528   0.5979   
as.factor(age)3:log(v1269) -0.14961    0.25809  -0.580   0.5622   
as.factor(age)4:log(v1269)  0.16534    0.24884   0.664   0.5065   

2 个答案:

答案 0 :(得分:0)

只要在格式中需要-1

reg <- lm(year ~ as.factor(age)*log(v1269) -1) 

答案 1 :(得分:0)

如果您想在age的每个级别估算不同的斜率,可以在公式中使用%in%运算符

set.seed(1)
df <- data.frame(age = factor(sample(1:4, 100, replace = TRUE)),
                 v1269 = rlnorm(100),
                 year = rnorm(100))

m <- lm(year ~ log(v1269) %in% age, data = df)
summary(m)

这给出了(对于这个完全随机的,虚拟的,愚蠢的数据集)

> summary(m)

Call:
lm(formula = year ~ log(v1269) %in% age, data = df)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.93108 -0.66402 -0.05921  0.68040  2.25244 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)
(Intercept)      0.02692    0.10705   0.251    0.802
log(v1269):age1  0.20127    0.21178   0.950    0.344
log(v1269):age2 -0.01431    0.24116  -0.059    0.953
log(v1269):age3 -0.02588    0.24435  -0.106    0.916
log(v1269):age4  0.06019    0.21979   0.274    0.785

Residual standard error: 1.065 on 95 degrees of freedom
Multiple R-squared:  0.01037,   Adjusted R-squared:  -0.0313 
F-statistic: 0.2489 on 4 and 95 DF,  p-value: 0.9097

请注意,这符合单个常量术语加上log(v1269)的4种不同效果,每age级别一个效果。从视觉上看,这就是模型正在做的事情

pred <- with(df,
             expand.grid(age = factor(1:4),
                         v1269 = seq(min(v1269), max(v1269), length = 100)))
pred <- transform(pred, fitted = predict(m, newdata = pred))

library("ggplot2")
ggplot(df, aes(x = log(v1269), y = year, colour = age)) + 
  geom_point() +
  geom_line(data = pred, mapping = aes(y = fitted)) +
  theme_bw() + theme(legend.position = "top")

Simulated data plus fitted slopes from the nested slope model described in the answer

显然,只有在year(响应)的平均值在不同年龄类别中没有显着差异时,这才适用。

请注意,可以通过/运算符实现相同模型的不同参数化:

m2 <- lm(year ~ log(v1269)/age, data = df)

> m2

Call:
lm(formula = year ~ log(v1269)/age, data = df)

Coefficients:
    (Intercept)       log(v1269)  log(v1269):age2  log(v1269):age3  
        0.02692          0.20127         -0.21559         -0.22715  
log(v1269):age4  
       -0.14108

请注意,现在,第一个log(v1269)字词用于age == 1的斜率,而其他字词是 adjust ,需要应用于{{1} }}获取指定组的斜率:

log(v1269)

但他们的估计斜率相同。