Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于具有线性依赖关系的模型,Reqsubsets结果与coef()不同_R_Cross Validation - Fatal编程技术网

对于具有线性依赖关系的模型,Reqsubsets结果与coef()不同

对于具有线性依赖关系的模型,Reqsubsets结果与coef()不同,r,cross-validation,R,Cross Validation,在对具有线性依赖关系的数据使用package中的regsubset时,我发现coef()和summary()$给出的结果有所不同。似乎,当发现线性依赖项时,重新排序会改变系数的位置,并且coef()返回错误的值 我使用mtcars只是为了“模拟”其他数据的问题。在第一个示例中,没有lin的问题。BIC的依赖关系和最佳给定模型是mpg~wt+cyl,两者coef(),summary()$,它们给出了相同的结果。在第二个示例中,我添加了伪变量,这样就有可能实现完全多重共线性,但这种顺序的变量(最后一

在对具有线性依赖关系的数据使用package
中的
regsubset
时,我发现
coef()
summary()$给出的结果有所不同。似乎,当发现线性依赖项时,重新排序会改变系数的位置,并且
coef()
返回错误的值

我使用
mtcars
只是为了“模拟”其他数据的问题。在第一个示例中,没有lin的问题。BIC的依赖关系和最佳给定模型是
mpg~wt+cyl
,两者
coef()
summary()$,它们给出了相同的结果。在第二个示例中,我添加了伪变量,这样就有可能实现完全多重共线性,但这种顺序的变量(最后一列中的伪变量)不会导致问题。在改变数据集中变量顺序后的最后一个示例中,问题最终出现了,
coef()
summary()$,它给出了不同的模型。这种方法有什么不正确的地方吗?有没有其他方法可以从
regsubset
中获取系数

require("leaps") #install.packages("leaps")
###Example1
dta <- mtcars[,c("mpg","cyl","am","wt","hp") ]
bestSubset.cars <- regsubsets(mpg~., data=dta)
(best.sum <- summary(bestSubset.cars))
#
w <- which.min(best.sum$bic)
best.sum$which[w,]
#
best.sum$outmat
coef(bestSubset.cars, w)
#
###Example2
dta2 <- cbind(dta, manual=as.numeric(!dta$am))
bestSubset.cars2 <- regsubsets(mpg~., data=dta)
(best.sum2 <- summary(bestSubset.cars2))
#
w <- which.min(best.sum2$bic)
best.sum2$which[w,]
#
coef(bestSubset.cars2, w)
#
###Example3
bestSubset.cars3 <- regsubsets(mpg~., data=dta2[,c("mpg","manual","am","cyl","wt","hp")])
(best.sum3 <- summary(bestSubset.cars3))
#
w <- which.min(best.sum3$bic)
best.sum3$which[w,]
#
coef(bestSubset.cars3, w)
#
best.sum2$which
coef(bestSubset.cars2,1:4)
best.sum3$which
coef(bestSubset.cars3,1:4)
require(“leaps”)#install.packages(“leaps”)
###例1

dtavars按summary.regsubsets和regsubsets排序不同。regsubsets的泛型函数coef()调用这两个函数合一,如果您试图强制.in或使用固定顺序的公式,则结果会很混乱。更改coef()函数中的某些行可能会有所帮助。试试下面的代码,看看是否有效

coef.regsubsets <- function (object, id, vcov = FALSE, ...) 
{
  s <- summary(object)
  invars <- s$which[id, , drop = FALSE]
  betas <- vector("list", length(id))
  for (i in 1:length(id)) {
    # added
    var.name <- names(which(invars[i, ]))
    thismodel <- which(object$xnames %in% var.name)
    names(thismodel) <- var.name
    # deleted
    #thismodel <- which(invars[i, ])
    qr <- .Fortran("REORDR", np = as.integer(object$np), 
                   nrbar = as.integer(object$nrbar), vorder = as.integer(object$vorder), 
                   d = as.double(object$d), rbar = as.double(object$rbar), 
                   thetab = as.double(object$thetab), rss = as.double(object$rss), 
                   tol = as.double(object$tol), list = as.integer(thismodel), 
                   n = as.integer(length(thismodel)), pos1 = 1L, ier = integer(1))
    beta <- .Fortran("REGCF", np = as.integer(qr$np), nrbar = as.integer(qr$nrbar), 
                     d = as.double(qr$d), rbar = as.double(qr$rbar), thetab = as.double(qr$thetab), 
                     tol = as.double(qr$tol), beta = numeric(length(thismodel)), 
                     nreq = as.integer(length(thismodel)), ier = numeric(1))$beta
    names(beta) <- object$xnames[qr$vorder[1:qr$n]] 
    reorder <- order(qr$vorder[1:qr$n])
    beta <- beta[reorder]
    if (vcov) {
      p <- length(thismodel)
      R <- diag(qr$np)
      R[row(R) > col(R)] <- qr$rbar
      R <- t(R)
      R <- sqrt(qr$d) * R
      R <- R[1:p, 1:p, drop = FALSE]
      R <- chol2inv(R)
      dimnames(R) <- list(object$xnames[qr$vorder[1:p]], 
                          object$xnames[qr$vorder[1:p]])
      V <- R * s$rss[id[i]]/(object$nn - p)
      V <- V[reorder, reorder]
      attr(beta, "vcov") <- V
    }
    betas[[i]] <- beta
  }
  if (length(id) == 1) 
    beta
  else betas
}

coef.regsubsets另一个对我有效的解决方案是在运行regsubsets之前随机化数据集中列(自变量)的顺序。其思想是,在重新排序之后,希望高度相关的列彼此相隔很远,并且不会触发regsubsets算法中的重新排序行为