我想使用“效果”包绘制带有错误功能区的交互效果。但是,我想根据可以使用“multiwayvcov”包计算的多路聚类协方差矩阵来计算误差。“effects”可以使用函数来计算协方差矩阵 (vcov.=),但该函数似乎不接受任何其他参数。
例子:
library(effects)
library(ggplot2)
library(multiwayvcov)
m1 <- lm(mpg ~ hp + wt + hp:wt, data=mtcars)
tmp <- as.data.frame(effect("hp:wt", model, vcov=vcov, se=TRUE, xlevels=list(wt=c(2.2,3.2,4.2))))
ggplot(data=tmp, aes(x=hp, y=fit, colour=as.factor(wt))) +
geom_line() +
geom_ribbon(aes(ymin=lower, ymax=upper, fill=as.factor(wt)), alpha = 0.5) +
labs(colour="wt")
Run Code Online (Sandbox Code Playgroud)
以上为使用非聚类 se 的交互生成了类似的图。我想要一些具有相同功能但带有集群 se 的东西。类似于(假设“gear”和“cyl”是 mtcars 数据中的集群 ID):
m1 <- lm(mpg ~ hp + wt + hp:wt, data=mtcars)
cluster.ids <- data.frame(i = mtcars$gear, j = mtcars$cyl)
tmp <- as.data.frame(effect("hp:wt", m1, vcov=cluster.vcov(m1, cluster = cluster.ids), xlevels=list(wt=c(2.2,3.2,4.2))))
Run Code Online (Sandbox Code Playgroud)
任何帮助深表感谢
我做了一些解决办法,可能对将来的其他人有用。看起来效果函数中的 vcov 参数只接受带有一个参数的函数,并且该参数必须是效果第一部分中的 lm (或其他)对象。如果您编写一个外部函数来在内部调整协方差矩阵函数的其他参数,它将起作用。
上面的例子:标准协方差矩阵
m1 <- lm(mpg ~ hp + wt + hp:wt, data=mtcars)
tmp1 <- as.data.frame(effect("hp:wt", m1, vcov=vcov, se=TRUE, xlevels=list(wt=c(2.2,3.2,4.2))))
ggplot(data=tmp, aes(x=hp, y=fit, colour=as.factor(wt))) +
geom_line() +
geom_ribbon(aes(ymin=lower, ymax=upper, fill=as.factor(wt)), alpha = 0.5) +
labs(colour="wt")
Run Code Online (Sandbox Code Playgroud)
hccm 协方差矩阵(来自汽车包),带有一个选项:
library(car)
m2 <- lm(mpg ~ hp + wt + hp:wt, data=mtcars)
hccmfunc <- function(x) {
return(hccm(x, type="hc0"))}
tmp2 <- as.data.frame(effect("hp:wt", m2, vcov=hccmfunc, xlevels=list(wt=c(2.2,3.2,4.2))))
Run Code Online (Sandbox Code Playgroud)
最后,多路聚类协方差矩阵(再次想象 gear 和 cyl 是 mtcars 数据中的聚类 ID):
m3 <- lm(mpg ~ hp + wt + hp:wt, data=mtcars)
cluster.ids <- data.frame(i = mtcars$gear, j = mtcars$cyl)
mwfunc <- function(x) {return(cluster.vcov(x, cluster= cluster.ids))}
tmp <- as.data.frame(effect("hp:wt", m3, vcov=mwfunc, xlevels=list(wt=c(2.2,3.2,4.2))))
Run Code Online (Sandbox Code Playgroud)
最后一个示例会引发 NaNs 错误,但这是因为该示例的具体情况。