在线性模型中使用两个矩阵的任何机会
Any chance to use two matrices in a linear model
我想知道,如果可以这样使用线性模型中的两个矩阵作为自变量和响应变量,即使用列对进行模型计算。
比方说,这两个矩阵叫做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, 100), 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
for 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]))
我想知道,如果可以这样使用线性模型中的两个矩阵作为自变量和响应变量,即使用列对进行模型计算。
比方说,这两个矩阵叫做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, 100), 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
for 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]))