我同时试图理解R的预测()功能和“效果”。 package effect()函数。基本上,我运行回归来测试DV上两个二分类IV的相互作用,同时控制两个连续的协变量。在我的实际数据集中,交互是重要的,所以现在我想绘制交互。因为我的模型中有协变量,所以我应该在控制这些其他变量(即SPSS中的估计边际均值)之后绘制均值。我之前没有在R中完成此操作,在搜索过程中,我发现我应该能够获得使用effect()或predict()函数绘制图形所需的值。因此,我尝试在随机生成的数据集上对每个数据集执行此操作:
> set.seed(100)
> test <- data.frame(iv1 = factor(round(rnorm(200, mean=.5, sd=.25), 0), levels=c(0,1), labels=c("A","B")), iv2 = factor(round(rnorm(200, mean=.5, sd=.25), 0), levels=c(0,1), labels=c("C","D")), cv1 = rnorm(200, mean=4, sd=1), cv2 = rnorm(200, mean=3, sd=1), dv = rnorm(200, mean=5, sd=1))
> mod <- lm(dv ~ cv1 + cv2 + iv1*iv2, data = test)
> new <- with(test, expand.grid(iv1 = levels(iv1), iv2 = levels(iv2), cv1 = mean(cv1), cv2 = mean(cv2)))
> test$pv <- predict(mod, newdata = new)
> tapply(test$pv, list(test$iv1, test$iv2), mean)
C D
A 5.076842 5.086218
B 5.025614 5.065399
> effect("iv1:iv2", mod)
iv1*iv2 effect
iv2
iv1 C D
A 5.019391 5.167275
B 5.216955 4.855195
因为我得到了不同的结果,我将数据导出到SPSS并运行ANOVA做同样的事情并查看估计的边际均值(EMMEANS)。这些与R中效应()给出的结果相同。
SPSS语法:
DATASET ACTIVATE DataSet1.
RECODE iv1 iv2 ('A'=-1) ('B'=1) ('C'=-1) ('D'=1) INTO iv1_recode iv2_recode.
EXECUTE.
UNIANOVA dv BY iv1_recode iv2_recode WITH cv1 cv2
/METHOD=SSTYPE(3)
/INTERCEPT=INCLUDE
/EMMEANS=TABLES(OVERALL) WITH(cv1=MEAN cv2=MEAN)
/EMMEANS=TABLES(iv1_recode) WITH(cv1=MEAN cv2=MEAN)
/EMMEANS=TABLES(iv2_recode) WITH(cv1=MEAN cv2=MEAN)
/EMMEANS=TABLES(iv1_recode*iv2_recode) WITH(cv1=MEAN cv2=MEAN)
/PRINT=DESCRIPTIVE
/CRITERIA=ALPHA(.05)
/DESIGN=cv1 cv2 iv1_recode iv2_recode iv1_recode*iv2_recode.
作为检查,EMMEANS的SPSS输出表示,&#34;出现在模型中的协变量按以下值评估:cv1 = 3.996208827095569,cv2 = 3.052881951477868。&#34;这些与我用于预测的协变量的值相同:
> new
iv1 iv2 cv1 cv2
1 A C 3.996209 3.052882
2 B C 3.996209 3.052882
3 A D 3.996209 3.052882
4 B D 3.996209 3.052882
那么我不明白的是什么?或者我在这里做一些愚蠢的事(一种明显的可能性)?这可能是我无法掌握估计的边际均值。
非常感谢任何帮助!
答案 0 :(得分:3)
因此,这里似乎有一些关于获取模型本身结果以及应用于观察数据的模型的混淆。这里出现了一个大问题
test$pv <- predict(mod, newdata = new)
此处,new
有4行,因此predict(mod, newdata = new)
具有值。只运行
predict(mod, newdata = new)
# 1 2 3 4
# 5.019391 5.216955 5.167275 4.855195
并注意这些值如何与effect()
的结果相匹配。
当您将它们分配给test$pv
时,该长度为4的向量会被回收,因此最终会在test
data.frame上重复50次。并且test
确实包含您的观察数据,因此将理论预测混合到模型中并且观察到的数据实际上并不是一个超级想法。如果你真的想要&#34; true&#34;每个观察的预测值,然后test$pv<-predict(mod)
将是正确的选择。但是,将test
的总和与
tapply(test$pv, list(test$iv1, test$iv2), mean)
将使用实际观察到的cv1
和cv2
的值,而不仅仅是您的协变量的整体平均值。
我们已经看到effect()
使用协变量的均值,但您也可以使用
effect("iv1:iv2", mod, given.values=c(cv1=3.996209, cv2=3.052882))
如果你愿意的话。