3

我有一个变量矩阵,我正在尝试运行一个循环来比较回归中所有变量之间的差异,以便生成一个矩阵并用差异填充。下面是一些模拟代码来解决这个问题。我想生成一个比较 x_1、x_2 和 x_3 的矩阵,以生成一个关于对角线对称的 3x3 矩阵,这些矩阵都应该为零。

y <- sample(seq(1:4), 100, replace = TRUE)
x_1 <- sample(seq(1:2), 100, replace = TRUE)
x_2 <- sample(seq(1:4), 100, replace = TRUE)
x_3 <- sample(seq(1:4), 100, replace = TRUE)

frame <- cbind(x_1, x_2, x_3)
dif <- matrix(NA, ncol = 3, nrow = 3)

for(i in 1:3){
    model_1 <- lm(y ~ frame[,i])
    model_2 <- lm(y ~ frame[,i])
    dif[i]<- (model_2$coef[2] - model_1$coef[2])
}

我对如何索引循环并参考 x 的矩阵以生成带有结果的 3x3 表感到困惑 - 任何帮助将不胜感激。

4

5 回答 5

2
 vcoef <- numeric(3)
 for(i in 1:3) { 
     vcoef[i] <- coef( lm(y~frame[,i]))[2]
               }

outer(vcoef, vcoef, "-")
#----------
          [,1]        [,2]        [,3]
[1,] 0.0000000 -0.15208933 -0.17302592
[2,] 0.1520893  0.00000000 -0.02093659
[3,] 0.1730259  0.02093659  0.00000000

如果您不想要冗余信息,则可以通过以下方式获得所有成对差异combn

> combcos  <- combn(vcoef,2)
> combcos[1, ] -combcos[2, ]
[1] -0.15208933 -0.17302592 -0.02093659
于 2013-07-01T23:01:43.733 回答
0

我更喜欢evalandparse路线,喜欢@Tyler 我喜欢base:::outer...

#  Make your data into a data.frame
df <- data.frame( y , x_1 , x_2 , x_3 )

#  The variables we want to test
x <- c("x_1","x_2","x_3") 

#  Make the text for each model to parse and evalaute
mods <- paste0( "lm( y ~ " , x , " , data = df )" )

#  Evaluate the lm for each variable
coefs <- unlist( lapply( mods , function(x) eval(parse(text=x))$coef[2] ) )
#       x_1         x_2         x_3 
# -0.52140856  0.04662379  0.08694344 

#  Combine the results with outer
outer( coefs , coefs ,  "-")
#         x_1         x_2         x_3
# x_1 0.0000000 -0.56803236 -0.60835201
# x_2 0.5680324  0.00000000 -0.04031965
# x_3 0.6083520  0.04031965  0.00000000
于 2013-07-01T22:51:48.423 回答
0

尝试这个:

model <- list()
for(i in 1:3) { 
    model[[i]] <- lm(y~frame[,i])
}

dif<-sapply( 1:3, function(i) { sapply(1:3, function(j) { model[[i]]$coef[2] - model[[j]]$coef[2] } ) } )

矩阵将是反对称的,即dif[i,j] = -dif[j,i]

于 2013-07-01T22:33:18.860 回答
0

我可能不明白你在追求什么,但这是一个使用outer多个向量版本的破解。

library(qdap)
FUN <- function(x1, x2, y)lm(y ~ x1)$coef[2] - lm(y ~ x2)$coef[2]
v_outer(list(x_1, x_2, x_3), FUN, y = y)

##       X1     X2     X3
## X1 0.000 -0.311 -0.079
## X2 0.311  0.000  0.232
## X3 0.079 -0.232  0.000
于 2013-07-01T22:45:06.380 回答
0

如果我理解您尝试通过比较模型的系数来比较模型。一种想法是使用meifly包。

首先我生成你的数据:

set.seed(1)
frame <- matrix(sample(1:4,3*100,rep=TRUE),ncol=3)
y <- sample(seq(1:4), 100, replace = TRUE)

然后我使用fitbestwhich 使用leaps包来非常快速地找到给定数量变量的 n 个最佳模型。

library(meifly)
library(reshape2)
library(ggplot2)
## we look only on models with one variable
res <- fitbest(y~.,as.data.frame(frame),nvmax=1)
## get coefficients
res.coef <- coef(res)
## remove zero models 
res.coef[res.coef == 0] <- NA
res.coef <- na.omit(res.coef)

现在对于每个模型,我们都有一个系数摘要。对于每个变量,我们有以下信息:

  1. 原始系数
  2. t 值和绝对 t 值
  3. 标准化系数。

res.coef 看起来像这样:

res.coef
     model observ         raw          t      abst         std
m1v1     1     V1 -0.12884211 -1.2438295 1.2438295 -0.14110975
m2v2     2     V3  0.09258638  0.8922776 0.8922776  0.10161095
m3v3     3     V2  0.01534989  0.1420060 0.1420060  0.01623527

比较模型的一种方法是绘制所有 vs 变量的散点图

colnames(res.coef)[colnames(res.coef)== "variable"] <- "observ"
dat <- melt(res.coef)
ggplot(dat) +
   geom_point(aes(observ,value,color=variable),size=5) +
   theme_bw()

在此处输入图像描述

于 2013-07-01T23:47:40.433 回答