如何解决在线性模型中使用两个矩阵的任何机会
我想知道,是否可以在线性模型中使用两个矩阵作为自变量和响应变量,将列对用于模型计算。
假设两个矩阵分别称为 x 和 y,那么我要计算
lm(y[,1] ~ x[,1])
lm(y[,2] ~ x[,2])
lm(y[,3] ~ x[,3])
etc,
但只需一个电话。
我试过的是
# Make two example matrices
x <- matrix(seq(1,100),nrow = 10)
y <- matrix(seq(1,nrow=10)
# First try
mod1 <- lm(y ~ x)
这只计算y的所有列和x的第一列的线性模型。
另一个想法是使用 apply()
# Second try
mod2 <- apply(x,2,function(x)(lm(y ~ x)))
这将计算 y 的所有列与 x 的所有列的线性模型。 这有点太多了,因为我只想要列对的线性模型。
我可以简单地使用 for 循环
mod_list <- list()
for (i in 1:nrow(x)) {
mod_list[[i]] <- lm(y[,i] ~ x[,i])
}
这至少可以计算成对模型。
所以。 是否可以使用两个矩阵并计算列对的模型而不使用 for 循环?
额外问题:有没有办法在 predict() 函数调用中使用上面计算出的模型列表,并给它一个矩阵作为新数据? 是的。将新数据的第一列与第一个模型一起使用,以此类推
我想我会被类似的东西困住
predicted <- matrix(nrow = 10,ncol = 10)
new_x <- matrix(seq(201,300),nrow = 10)
for (i in 1:nrow(x)) {
mod <- lm(y ~ x,data = data.frame(x = x[,i],y = y[,i]))
predicted[,i] <- predict(mod,newdata = data.frame(x = new_x[,i]))
}
解决方法
您可以使用 Map
。
res <- Map(function(y,x) lm(y ~ x),as.data.frame(x),as.data.frame(y))
stopifnot(identical(as.numeric(res[[4]]$coe),as.numeric(lm(y[,4] ~ x[,4])$coe)))
和 mapply
为 predict
提供所需的矩阵格式。
res2 <- t(mapply(function(k,l) predict(k,newdata=list(x=l)),res,asplit(new_x,2)))
res2
# 1 2 3 4 5 6 7 8 9 10
# V1 201 202 203 204 205 206 207 208 209 210
# V2 211 212 213 214 215 216 217 218 219 220
# V3 221 222 223 224 225 226 227 228 229 230
# V4 231 232 233 234 235 236 237 238 239 240
# V5 241 242 243 244 245 246 247 248 249 250
# V6 251 252 253 254 255 256 257 258 259 260
# V7 261 262 263 264 265 266 267 268 269 270
# V8 271 272 273 274 275 276 277 278 279 280
# V9 281 282 283 284 285 286 287 288 289 290
# V10 291 292 293 294 295 296 297 298 299 300
stopifnot(identical(predict(res[[1]],newdata=list(x=new_x[,1])),res2[1,]))
,
lapply
应该可以工作:
lms <- lapply(1:3,function(z) lm(y[,z] ~ x[,z]))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。