[英]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
交互作用項捕獲了我感興趣的效果。
有沒有一種方法可以指定僅計算以下交互項的lm
: groupb:levelx
, groupb:levely
和groupb:levelz
? 我相信這可以告訴我每個level
如何受到“ b” group
(相對於“ a” group
)的影響,我認為這是我感興趣的。
我最接近的是:
lm(measurement ~ 0 + group * level - group, data = df)
但這仍然可以計算levelx
, levely
和levelz
,我對此並不感興趣。
就像上面提到的@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.