具有变量变换的多元回归的自动化

时间:2016-09-19 23:33:11

标签: arrays r loops regression cycle

我正在研究回归问题,并尝试使该过程更加自动化。对于每个x变量,我都有一个X矩阵的转换我想测试(每列代表x变量的变换)。所以我需要创建一个循环,从每个X矩阵中取一个向量,根据y变量测试它们并存储每个变量的t值。

我为2个X变量进行了研究,但需要你的帮助才能将其扩展到n个变量。代码如下。

testvars <- function(y,X1,X2) {

  Tvals_X1 = data.frame(matrix(0, ncol = ncol(X2), nrow = ncol(X1)))
  Tvals_X2 = data.frame(matrix(0, ncol = ncol(X2), nrow = ncol(X1)))

  for (i in 1:ncol(X1)) {
    for (j in 1:ncol(X2)) {
      temp <- lm(y ~ X1[,i] + X2[,j])
      Tvals_X1[i,j] <- summary(temp)$coefficients[2,3]
      Tvals_X2[i,j] <- summary(temp)$coefficients[3,3]
    }
  }
}

2 个答案:

答案 0 :(得分:1)

这是我的方法;

# example datas
set.seed(1); y <- matrix(runif(20), ncol=1)
set.seed(2); x1 <- matrix(runif(60), ncol=3)
set.seed(3); x2 <- matrix(runif(80), ncol=4)
set.seed(4); x3 <- matrix(runif(40), ncol=2)
set.seed(5); x4 <- matrix(runif(60), ncol=3)
我制作了具有col-number的所有组合的矩阵
col.v <- sapply(list(x1,x2,x3,x4), ncol)         # ncols of each data
col.comb <- expand.grid(sapply(col.v, seq.int))  # its all combinations
# > head(col.comb, n=4)
#   Var1 Var2 Var3 Var4
# 1    1    1    1    1
# 2    2    1    1    1
# 3    3    1    1    1
# 4    1    2    1    1
# 5    2    2    1    1
我得到了 apply(col.comb,1,...) 的价值
tval <- apply(col.comb, 1, function(a) { 
  temp <- lm(y ~ x1[,a[1]] + x2[,a[2]] + x3[,a[3]] + x4[,a[4]])
  summary(temp)$coefficients[2:5, 3] })

# > head(tval, n=2)              # tval is matrix
#       x1[, a[1]] x2[, a[2]] x3[, a[3]] x4[, a[4]]
# [1,] -0.05692452 -0.9047370 -0.3758997   1.968530
# [2,]  0.03476527 -0.9260632 -0.3740936   1.965884
我将tval-matrix的每个col更改为 array ,并将每个 数组 合并到 list < / EM> 即可。
results <- list()            # results[[1]] is x1's array
for(i in seq.int(length(col.v))) results[[i]] <- array(tval[,i], dim=col.v)
 # names(results) <- c("x1", "x2", "x3", "x4")   # if you want

results2 <- array(t(tval), dim=c(length(col.v), col.v))   # all.array.version
 ## results[[1]] is the same as results2[1,,,,]   # both is x1's array
  # dimnames(results2)[[1]] <- list("x1", "x2", "x3", "x4")   # if you need
校验
c(results[[1]][2,3,2,3], results[[2]][2,3,2,3], results[[3]][2,3,2,3], results[[4]][2,3,2,3])
# [1]  0.54580342 -0.56418433 -0.02780492 -0.50140806

c(results2[1,2,3,2,3], results2[2,2,3,2,3], results2[3,2,3,2,3], results2[4,2,3,2,3])
# [1]  0.54580342 -0.56418433 -0.02780492 -0.50140806

summary(lm(y ~ x1[,2] + x2[,3] + x3[,2] + x4[,3]))$coefficients[2:5,3]
#    x1[, 2]     x2[, 3]     x3[, 2]     x4[, 3] 
# 0.54580342 -0.56418433 -0.02780492 -0.50140806   # no problem
功能版本(n = 4);
testvars2 <- function(y, x1, x2, x3, x4){

  col.v <- sapply(list(x1,x2,x3,x4), ncol)
  col.comb <- expand.grid(sapply(col.v, seq.int))

  tval <- t(apply(col.comb, 1, function(a) { 
    temp <- lm(y ~ x1[,a[1]] + x2[,a[2]] + x3[,a[3]] + x4[,a[4]])
    summary(temp)$coefficients[2:5, 3] }))

  results <- list()
  for(i in seq.int(length(col.v))) results[[i]] <- array(tval[,i], dim=col.v)
  #results2 <- array(t(tval), dim=c(length(col.v), col.v))

  return(results)
}

答案 1 :(得分:0)

由于这是StackOverflow而不是CrossValidated,我将跳过有关这种变量选择的方法问题的任何警告。注意事项。

计算上,反复调用 dispatch: { renderEnd: function(e) { //for each text d3.selectAll(".nv-legend text")[0].forEach(function(d){ //get the data var t= d3.select(d).data()[0]; //set the new data in the innerhtml d3.select(d).html(t.key + " - " + t.y); }); } } lm会使R做相当多的簿记;相反,我会建议glmadd1函数。以下是示例中的示例输出,它测试将每个双向交互添加到模型中。在您的情况下,由于每个预测变量使用1个自由度,因此F stat是t-stat的平方。

drop1