使用因子创建矩阵 lm 模型
create matrix lm model with factors
我想创建 100 个模拟并使用矩阵为每个模型创建一个线性模型。我使用了以下代码,但出现错误。实现此目标的最佳方法是什么?
n=15;nsims=100
factor=matrix(as.factor(rep(1:5,3)),n, nsims)
sim=matrix(rnorm(nfactor*nsims,0,1),n,nsims)
> dim(factor)
[1] 15 100
> lm1=lm(sim~factor)
Error in `[[<-.data.frame`(`*tmp*`, i, value = c(1L, 2L, 3L, 4L, 5L, 1L, :
replacement has 1500 rows, data has 15
我不清楚你想要什么。
创建数据:
n <- 15; nsims <- 100; nfactor <- 5
f <- matrix(as.factor(rep(1:nfactor,n/nfactor)), n, nsims)
set.seed(101)
sim <- matrix(rnorm(nfactor*nsims,0,1),n,nsims)
(一般来说,用现有函数的名称命名变量是不好的做法(factor
)...)
res <- vector("list", nsims)
for (i in 1:nsims) {
res[[i]] <- lm(y~x,
data=data.frame(y=sim[,i],x=f[,i]))
}
for
循环可能看起来很笨重,但是(如 R Inferno 第 4 章中所讨论的)它通常是编写代码的最清晰的方法......如果你 真的 想在没有 for
循环的情况下做到这一点,在 f
的列可能不同的一般情况下,你可以做
res2 <- mapply(function(x,y) lm(y~x),
split(f,col(f)),split(sim,col(sim)),SIMPLIFY=FALSE)
但我认为它不如 for
循环清晰...
update:我不知道是不是故意的,但是你的因子矩阵的每一列都是相同的。因此,您可以将单个输入变量放在公式的右侧,将矩阵响应放在公式的左侧:
all(apply(f[,-1],2,identical,f[,1])) ## all TRUE
res2 <- lm(sim~f[,1])
我想创建 100 个模拟并使用矩阵为每个模型创建一个线性模型。我使用了以下代码,但出现错误。实现此目标的最佳方法是什么?
n=15;nsims=100
factor=matrix(as.factor(rep(1:5,3)),n, nsims)
sim=matrix(rnorm(nfactor*nsims,0,1),n,nsims)
> dim(factor)
[1] 15 100
> lm1=lm(sim~factor)
Error in `[[<-.data.frame`(`*tmp*`, i, value = c(1L, 2L, 3L, 4L, 5L, 1L, :
replacement has 1500 rows, data has 15
我不清楚你想要什么。
创建数据:
n <- 15; nsims <- 100; nfactor <- 5
f <- matrix(as.factor(rep(1:nfactor,n/nfactor)), n, nsims)
set.seed(101)
sim <- matrix(rnorm(nfactor*nsims,0,1),n,nsims)
(一般来说,用现有函数的名称命名变量是不好的做法(factor
)...)
res <- vector("list", nsims)
for (i in 1:nsims) {
res[[i]] <- lm(y~x,
data=data.frame(y=sim[,i],x=f[,i]))
}
for
循环可能看起来很笨重,但是(如 R Inferno 第 4 章中所讨论的)它通常是编写代码的最清晰的方法......如果你 真的 想在没有 for
循环的情况下做到这一点,在 f
的列可能不同的一般情况下,你可以做
res2 <- mapply(function(x,y) lm(y~x),
split(f,col(f)),split(sim,col(sim)),SIMPLIFY=FALSE)
但我认为它不如 for
循环清晰...
update:我不知道是不是故意的,但是你的因子矩阵的每一列都是相同的。因此,您可以将单个输入变量放在公式的右侧,将矩阵响应放在公式的左侧:
all(apply(f[,-1],2,identical,f[,1])) ## all TRUE
res2 <- lm(sim~f[,1])