我遇到了一个问题:有人使用http://www.highstat.com/index.php/mixed-effects-models-and-extensions-in-ecology-with-r页面中的代码 HighstatLibV10.R 运行了corvif函数吗?我无法获取VIF值,因为输出给出了这个错误:
Error in myvif(lm_mod) : object 'tmp_cor' not found!
我有6个物理变量,我正在寻找变量之间的共线性。任何帮助都超过欢迎!
答案 0 :(得分:1)
如果使用corvif()
并不是最重要的,您可以使用R套餐中的vif()
' car'获取线性模型的VIF值。
答案 1 :(得分:0)
所以tmp_cor
是一个应该在corvif
tmp_cor
是使用cor
函数(在R安装附带的基础stats
包中)通过以下方式创建的:tmp_cor <- cor(dataz,use="complete.obs")
。但是,我注意到,使用Zurr等人的 HighstatLib.R 代码v1和v10时,会出现此错误:
Error in myvif(lm_mod) : object 'tmp_cor' not found!
首先我检查了V10:
似乎&#34; final&#34;在采购 HighstatLibV10.R 时创建的corvif
版本实际上忽略了创建tmp_cor
!
> print(corvif)
function(dataz) {
dataz <- as.data.frame(dataz)
#vif part
form <- formula(paste("fooy ~ ",paste(strsplit(names(dataz)," "),collapse=" + ")))
dataz <- data.frame(fooy=1 + rnorm(nrow(dataz)) ,dataz)
lm_mod <- lm(form,dataz)
cat("\n\nVariance inflation factors\n\n")
print(myvif(lm_mod))
}
但是,我注意到OP的帖子中的错误也发生在使用V1时(即 HighstatLib.R 与Zuur et al 2010相关联)。虽然代码文件创建了corvif
的2个版本,但它们(尤其是后者将取代第一个版本)包含一行来创建tmp_cor
:
corvif <- function(dataz) {
dataz <- as.data.frame(dataz)
#correlation part
cat("Correlations of the variables\n\n")
tmp_cor <- cor(dataz,use="complete.obs")
print(tmp_cor)
#vif part
form <- formula(paste("fooy ~ ",paste(strsplit(names(dataz)," "),collapse=" + ")))
dataz <- data.frame(fooy=1,dataz)
lm_mod <- lm(form,dataz)
cat("\n\nVariance inflation factors\n\n")
print(myvif(lm_mod))
}
因此即使corvif
的代码在V1代码文件中创建tmp_cor
,辅助函数myvif
(实际上使用tmp_cor
对象)似乎也是没有访问它。
这表明我们有一个范围界定问题......
果然,如果我只是快速更改tmp_cor
行以创建global object,代码就可以正常运行:
tmp_cor <<- cor(dataz,use="complete.obs")
具体做法是:
corvif <- function(dataz) {
dataz <- as.data.frame(dataz)
#correlation part
cat("Correlations of the variables\n\n")
tmp_cor <<- cor(dataz,use="complete.obs")
print(tmp_cor)
#vif part
form <- formula(paste("fooy ~ ",paste(strsplit(names(dataz)," "),collapse=" + ")))
dataz <- data.frame(fooy=1,dataz)
lm_mod <- lm(form,dataz)
cat("\n\nVariance inflation factors\n\n")
print(myvif(lm_mod))
}
更完整的&#34;修复&#34;可以通过操纵environments
来完成。