如何更改对比度以与所有级别的平均值而不是参考级别(R,lmer)进行比较?
How to change contrasts to compare with mean of all levels rather than reference level (R, lmer)?
我有一个数据集,其中每一行都是销售人员对商店的一次访问,字段包括 "outlet"(商店 ID)、"devices"(销售人员销售了多少电子设备)和 "weekday"(销售人员在商店的星期几)。
我想弄清楚一个工作日是否比其他工作日的销售更好,所以不要比较一周中的所有日子,例如星期一我想将它们与一周中所有日子的平均值进行比较。为此,我正在使用 lmerTest 函数(lme4::lmer 和估计的 p 值)。
我试过以下代码:
data$weekday <- factor(weekday_sales$weekday, levels=c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"))
contrasts(data$weekday) = contr.sum(7)
summary(lmerTest::lmer(data=data, devices~weekday + (1|outlet)))
给出:
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 4.3681 0.6024 12.4472 7.251 8.24e-06 ***
weekday1 -1.0585 0.5129 145.7337 -2.064 0.04080 *
weekday2 -0.2830 0.4958 142.3214 -0.571 0.56913
weekday3 1.1884 0.4907 140.5545 2.422 0.01671 *
weekday4 0.1100 0.5025 145.1407 0.219 0.82707
weekday5 1.3589 0.5135 143.8204 2.646 0.00904 **
weekday6 -0.1629 0.5020 143.1605 -0.325 0.74600
然而,数据集中有所有七个工作日(缺少一个),并且数据集中工作日的级别存储为 "Monday"、"Tuesday"、"Wednesday" 等。不像 "weekday1"、"weekday2" 等
为什么少了一个工作日,我怎么知道这是哪一天?这是将每个工作日与平均值进行比较还是在做其他事情? (如果是这样,我该如何更改对比度以将所有级别与所有级别的平均值进行比较?)
您需要明确禁止拦截:
devices~ -1 + weekday + (1|outlet))
或
devices ~ 0 + weekday + (1|outlet))
不是特别清楚,但是当你使用和到零的对比时,第一个参数是(level 1 - mean),第二个是(level 2 - mean),等等,所以缺少比较是最后一级:"Sunday vs. mean".
set.seed(101)
w <- c("Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday", "Sunday")
dd <- data.frame(w=factor(rep(w,10),levels=w),y=rnorm(70))
m0 <- lm(y~w,dd, contrasts=list(w=contr.sum))
m1 <- lm(y~w-1,dd, contrasts=list(w=contr.sum))
问题在于,使用总和对比时,您无法将所有组与总体平均值进行比较,因为它们不是独立的。如果您知道总均值 G
,然后知道第 1 -6 天的均值,则可以根据您已有的值计算第 7 天的均值。所以基本上,您不能使用对比来做到这一点——您需要某种 post-hoc 测试。
使用标准治疗对比,您仍然只进行六次比较(1-2、1-3、1-4、1-5、1-6、1-7),通常的问题是:嘿, 1去哪儿了。答案是拦截。在这里,你有G-1、G-2、G-3、G-4、G-5、G-6,然后失去G-7。
我有一个数据集,其中每一行都是销售人员对商店的一次访问,字段包括 "outlet"(商店 ID)、"devices"(销售人员销售了多少电子设备)和 "weekday"(销售人员在商店的星期几)。
我想弄清楚一个工作日是否比其他工作日的销售更好,所以不要比较一周中的所有日子,例如星期一我想将它们与一周中所有日子的平均值进行比较。为此,我正在使用 lmerTest 函数(lme4::lmer 和估计的 p 值)。
我试过以下代码:
data$weekday <- factor(weekday_sales$weekday, levels=c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"))
contrasts(data$weekday) = contr.sum(7)
summary(lmerTest::lmer(data=data, devices~weekday + (1|outlet)))
给出:
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 4.3681 0.6024 12.4472 7.251 8.24e-06 ***
weekday1 -1.0585 0.5129 145.7337 -2.064 0.04080 *
weekday2 -0.2830 0.4958 142.3214 -0.571 0.56913
weekday3 1.1884 0.4907 140.5545 2.422 0.01671 *
weekday4 0.1100 0.5025 145.1407 0.219 0.82707
weekday5 1.3589 0.5135 143.8204 2.646 0.00904 **
weekday6 -0.1629 0.5020 143.1605 -0.325 0.74600
然而,数据集中有所有七个工作日(缺少一个),并且数据集中工作日的级别存储为 "Monday"、"Tuesday"、"Wednesday" 等。不像 "weekday1"、"weekday2" 等
为什么少了一个工作日,我怎么知道这是哪一天?这是将每个工作日与平均值进行比较还是在做其他事情? (如果是这样,我该如何更改对比度以将所有级别与所有级别的平均值进行比较?)
您需要明确禁止拦截:
devices~ -1 + weekday + (1|outlet))
或
devices ~ 0 + weekday + (1|outlet))
不是特别清楚,但是当你使用和到零的对比时,第一个参数是(level 1 - mean),第二个是(level 2 - mean),等等,所以缺少比较是最后一级:"Sunday vs. mean".
set.seed(101)
w <- c("Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday", "Sunday")
dd <- data.frame(w=factor(rep(w,10),levels=w),y=rnorm(70))
m0 <- lm(y~w,dd, contrasts=list(w=contr.sum))
m1 <- lm(y~w-1,dd, contrasts=list(w=contr.sum))
问题在于,使用总和对比时,您无法将所有组与总体平均值进行比较,因为它们不是独立的。如果您知道总均值 G
,然后知道第 1 -6 天的均值,则可以根据您已有的值计算第 7 天的均值。所以基本上,您不能使用对比来做到这一点——您需要某种 post-hoc 测试。
使用标准治疗对比,您仍然只进行六次比较(1-2、1-3、1-4、1-5、1-6、1-7),通常的问题是:嘿, 1去哪儿了。答案是拦截。在这里,你有G-1、G-2、G-3、G-4、G-5、G-6,然后失去G-7。