我有一个变量矩阵,我试图运行一个循环,比较回归中所有变量之间的差异,以便生成矩阵并用差异填充。下面是一些解决问题的模拟代码。我想生成一个比较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表 - 任何帮助都会非常感激。
答案 0 :(得分: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
答案 1 :(得分: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]
答案 2 :(得分: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
答案 3 :(得分:0)
我更喜欢eval
和parse
路线,喜欢@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
答案 4 :(得分:0)
如果我理解你试图通过比较它们的系数来比较模型。一个想法是使用meifly
包。
首先我生成你的数据:
set.seed(1)
frame <- matrix(sample(1:4,3*100,rep=TRUE),ncol=3)
y <- sample(seq(1:4), 100, replace = TRUE)
然后我使用fitbest
使用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)
现在,对于每个模型,我们都有系数的摘要。对于每个变量,我们都有以下信息:
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
比较模型的一种方法是绘制所有与变量的散点图
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()