我正在研究回归问题,并尝试使该过程更加自动化。对于每个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]
}
}
}
答案 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做相当多的簿记;相反,我会建议glm
和add1
函数。以下是示例中的示例输出,它测试将每个双向交互添加到模型中。在您的情况下,由于每个预测变量使用1个自由度,因此F stat是t-stat的平方。
drop1