簡體   English   中英

如何指定lm模型矩陣

[英]How to specify lm model matrix

我從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)))

我對量化每個level measurement如何受group影響很感興趣。

我猜想線性模型( lm )是解決此問題的合適方法,其中group:level交互作用項捕獲了我感興趣的效果。

有沒有一種方法可以指定僅計算以下交互項的lmgroupb:levelxgroupb:levelygroupb:levelz 我相信這可以告訴我每個level如何受到“ b” group (相對於“ a” group )的影響,我認為這是我感興趣的。

我最接近的是:

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

但這仍然可以計算levelxlevelylevelz ,我對此並不感興趣。

就像上面提到的@Lyzander一樣,您應該進一步澄清您想要的內容。 根據您所說的“對於每個級別,測量如何受到“ b”組(相對於“ a”組的影響)”,我猜有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 

如果您查看統計信息(第一種方法)和模型的系數,您會發現所有這三種方法都彼此一致。

我會采用第二種方法,因為這是唯一一種可以為您提供有關某個level內的group (a與b)的差異是否具有統計顯着性的信息。 第一種方法只是報告手段。 第三種方法包括p值,但它們對應於具有基准交互作用值的比較,而不對應於組a和b之間的比較。

您提到“僅計算這些交互項:groupb:levelx,groupb:levely和groupb:levelz”,這意味着您將不會獲得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。

基於這句話:“有沒有一種方法可以指定僅計算以下交互項的lm:groupb:levelx,groupb:levely和groupb:levelz?”,我認為您只需要:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM