对不同自变量集的多元回归

时间:2014-02-04 19:55:40

标签: r regression sapply mapply

一开始:我是R的'新鲜'用户,请原谅我所有的错误和愚蠢的问题。

我想估计570(30 * 19)个方程(并得到它们的摘要())。每个等式的形式为:y~x2 + x3 + x4,其中x2,x3和x4是列表。

评论#1是我失败的试验 - 它可以显示我想要实现的目标。 在注释#2中这样的等式正在运行,但是我需要手动更改变量“jan”(到feb,mar等)应该从列表“x2”中获取。这段代码给我返回了30个方程,但是我需要用另外一个变量来估计每个变量 - 来自名为“x2”的19个元素列表中的x2

如何自动完成?我的意思是: mapply - 将rlm模型应用于列表的每个元素,例如: 列表“y”中的元素1与“x3”中的元素1和“x4”中的元素1相对应(我在准备csv文件时注意了顺序) - 这是正确的但我想运行这样的方程式在注释#2下方附加变量x2。这个变量不对应任何其他变量 - 它总是应该在列表“y”的元素的30个回归中的每一个中,只是从列表“x2”的元素1变为“x2”的元素19。

最后我想拥有570(30 * 19)“summ”矩阵和570“archtest”

我希望这不是混乱,如果是的话,我会尝试在一段时间内再次发布澄清。

非常感谢您的理解和帮助。

data<-read.table("MAY EFFECT Rdata 18.09.2013-3 ind prod CCI.csv", head=T, sep=";", dec=".")
library(MASS)
library(FinTS)
index1<-data[,2:31]   # y  30  elements; rates, 30 countries
index2<-data[,32:50] # x2  19  elements; month dummies, months and other
index3<-data[,51:80] # x3  30  elements; IP
index4<-data[,81:110] # x4 30  elements; CCI

y<-as.list(index1)
x2<-as.list(index2)
x3<-as.list(index3)
x4<-as.list(index4)

#1. this is my trial I need to make "x2" variable that stands for month dummy be respectively equal jan, feb ... and so on till
# the end of list x2 (19 elements)
result<-mapply(function(x2) mapply(function(y,x3,x4,x2) summary(rlm(y~x2+x3+x4, maxit = 15600, data=data)), y,x3,x4),x2)

#2. this code below is returning 10x30 list matrix "summ" and 5x30 data frame "archtest"
summ<- mapply(function(y,x3,x4,jan) summary(rlm(y~jan+x3+x4, maxit = 15600, data=data)), y,x3,x4)
archtest<-mapply(function (y,x3,x4,jan,resi) {regr<-rlm(y~jan+x3+x4, maxit = 15600, data=data)
                                              ArchTest (resid(regr), lags=12, demean = FALSE)},y,x3,x4)

####

1 个答案:

答案 0 :(得分:1)

如果我理解正确,那么有30套(y,x3和x4)以及这19套x2中的每一套。如果这是正确的,那么这样的事情应该有效:

set.seed(1)
data <- matrix(rnorm(50*110),nrow=50)  # completely random data...

get.summary <- function(i,j) {
  dta <- data.frame(y=data[,1+i],x2=data[,31+j], x3=data[,50+i],x4=data[,80+i])
  summary(lm(y~x2+x3+x4, data=dta))
}

smry.list <- do.call(cbind,lapply(1:19,function(j){lapply(1:30,get.summary,j)}))
smry.list[1,1]

所以现在smry.list包含所有570个摘要,按19列30行排列。

您可以使用mapply(...)执行类似操作,但结果是一维列表:

smry.mapply<- mapply(get.summary,rep(1:30,each=19),1:19, SIMPLIFY=F)
smry.mapply[1]