如何指定lm模型矩阵

时间:2015-11-04 16:31:35

标签: r lm

我从2组获得测量结果,其中每组具有相同的3个水平。 这是我的例子data.frame

df <- data.frame(measurement = c(rnorm(10,1,1),rnorm(10,0.75,1),rnorm(10,1.25,1),
                rnorm(10,0.5,1),rnorm(10,1.75,1),rnorm(10,0.25,1)),
                group = as.factor(c(rep("a",30),rep("b",30))),
                level = as.factor(rep(c(rep("x",10),rep("y",10),rep("z",10)),2)))

我有兴趣量化每个measurementlevelgroup影响的方式。

我猜一个线性模型(lm)是适合这种情况的方法,其中group:level互动术语捕获了我感兴趣的效果。

有没有办法指定只计算这些互动字词的lmgroupb:levelxgroupb:levelygroupb:levelz?我相信这会告诉我每个level如何受group&#34; b&#34; (相对于group&#34; a&#34;),我认为这是我感兴趣的。

我最接近的是:

lm(measurement ~ 0 + group * level - group, data = df)

但这仍然会计算levelxlevelylevelz的影响,我对此并不感兴趣。

2 个答案:

答案 0 :(得分:1)

正如@Lyzander上面提到的,你应该更多地澄清你想要的东西。根据您所说的&#34;测量如何受到组&#34; b&#34; (相对于组&#34; a&#34;)对于每个级别&#34;,我想有3种简单的方法可以做到这一点。

df <- data.frame(measurement = c(rnorm(10,1,1),rnorm(10,0.75,1),rnorm(10,1.25,1),
                                 rnorm(10,0.5,1),rnorm(10,1.75,1),rnorm(10,0.25,1)),
                 group = as.factor(c(rep("a",30),rep("b",30))),
                 level = as.factor(rep(c(rep("x",10),rep("y",10),rep("z",10)),2)))


library(dplyr)

#### calculate stats (mean values) ---------------------------------------------
df %>% group_by(level, group) %>% summarise(MeanMeasurement = mean(measurement))

#     level  group MeanMeasurement
#    (fctr) (fctr)           (dbl)
# 1      x      a       1.6708659
# 2      x      b       0.8487751
# 3      y      a       0.7977769
# 4      y      b       1.4209206
# 5      z      a       1.5484668
# 6      z      b      -0.3244225

#### build a model for each level ---------------------------------------------
summary(lm(measurement ~ group  , data = df[df$level=="x",]))

# Coefficients:
#   Estimate Std. Error t value Pr(>|t|)    
# (Intercept)   1.6709     0.3174   5.264 5.27e-05 ***
#   groupb       -0.8221     0.4489  -1.831   0.0837 .


summary(lm(measurement ~ group  , data = df[df$level=="y",]))

# Coefficients:
#   Estimate Std. Error t value Pr(>|t|)   
# (Intercept)   0.7978     0.2565   3.111  0.00604 **
#   groupb        0.6231     0.3627   1.718  0.10295


summary(lm(measurement ~ group  , data = df[df$level=="z",]))

# Coefficients:
#   Estimate Std. Error t value Pr(>|t|)    
# (Intercept)   1.5485     0.3549   4.363 0.000375 ***
#   groupb       -1.8729     0.5019  -3.731 0.001528 **



## build a model only with interactions ------------------------------------------
summary(lm(measurement ~ group : level , data = df))

# Coefficients: (1 not defined because of singularities)
# Estimate Std. Error t value Pr(>|t|)    
# (Intercept)    -0.3244     0.3123  -1.039 0.303452    
# groupa:levelx   1.9953     0.4416   4.518 3.43e-05 ***
#   groupb:levelx   1.1732     0.4416   2.657 0.010354 *  
#   groupa:levely   1.1222     0.4416   2.541 0.013951 *  
#   groupb:levely   1.7453     0.4416   3.952 0.000227 ***
#   groupa:levelz   1.8729     0.4416   4.241 8.76e-05 ***
#   groupb:levelz       NA         NA      NA       NA 

如果你检查统计数据(第一种方法)和模型&#39;系数你会发现所有这三种方法都是一致的。

我选择了第二种方法,因为它是唯一能够向您提供有关grouplevel(a vs b)的差异是否具有统计显着性的信息。第一种方法只是报告手段。第3种方法包括p值,但它们对应于与基线相互作用值的比较,而不是与a和b组之间的比较。

你提到过#34;只计算这些互动条款:groupb:levelx,groupb:levely,groupb:levelz&#34;这意味着你不会得到a和x,y,z的其他3个交互。换句话说,您强制模型包含这3个交互。

您可以像这样手动执行此操作

df <- data.frame(measurement = c(rnorm(10,1,1),rnorm(10,0.75,1),rnorm(10,1.25,1),
                                 rnorm(10,0.5,1),rnorm(10,1.75,1),rnorm(10,0.25,1)),
                 group = as.factor(c(rep("a",30),rep("b",30))),
                 level = as.factor(rep(c(rep("x",10),rep("y",10),rep("z",10)),2)))

library(dplyr)

df %>%
  mutate(interactions = paste0(group,":",level),
         interactions = ifelse(group=="a","a",interactions)) -> df2

summary(lm(measurement ~ interactions, data = df2))

# Coefficients:
#   Estimate Std. Error t value Pr(>|t|)    
# (Intercept)       0.9318     0.1831   5.089 4.36e-06 ***
#   interactionsb:x  -0.7803     0.3662  -2.131  0.03752 *  
#   interactionsb:y   0.2747     0.3662   0.750  0.45638    
# interactionsb:z  -1.1367     0.3662  -3.104  0.00299 ** 

但现在将其他3个交互组合在一起,每次将3个交互中的每个交互(b:x,b:y,b:z)与通用组a进行比较。你不能比较x,y和z中的a与b,但你比较b组中x与y对比z。

答案 1 :(得分:0)

基于这句话:&#34;有没有办法指定只计算这些交互项的lm:groupb:levelx,groupb:levely,groupb:levelz?&#34;,我想你只是想:

lm( measurement ~ level +0, subset = group=="b", data = df)