2013-02-13 19 views
1

函数lm(...)返回类“lm”的对象。我如何创建一个这样的对象数组?我要做到以下几点:在R中创建特定类的对象

my_lm_array <- rep(as.lm(NULL), 20) 
#### next, populate this array by running lm() repeatedly: 
for(i in 1:20) { 
    my_lm_array[i] <- lm(my_data$results ~ my_data[i,]) 
} 

显然符合 “my_lm < - 代表(as.lm(NULL),20)” 不起作用。我试图创建一个'lm'类型的对象数组。我怎么做?

+1

真的是'my_data [i,]'在'lm'调用中,而不是'my_data [,i]'? – juba 2013-02-13 20:31:53

+0

由于您明显在谈论单个尺寸的对象(事实上是一个非尺寸的对象),因此您应该避免使用“数组”这个词作为R语法中的特定含义。 – 2013-02-13 21:05:19

+0

是的,我认为你是对的(我在R方面还是比较新的)。 – user2069819 2013-02-13 22:39:08

回答

2

不知道它会回答你的问题,但如果你想要做的是运行从对数据帧的不同列变量的一系列lm什么,你可以做这样的事情:

data <- data.frame(result=rnorm(10), v1=rnorm(10), v2=rnorm(10)) 
my_lms <- lapply(data[,c("v1","v2")], function(v) { 
    lm(data$result ~ v) 
}) 

然后,my_lms将是类lm的元素列表。

+0

我明白这是做什么。让我试试看。谢谢 – user2069819 2013-02-13 22:39:27

1

好了,你可以如下创建空/无意义lm对象的数组:

z <- NA 
class(z) <- "lm" 
lm_array <- replicate(20,z,simplify=FALSE) 

但是这可能不是解决问题的最好办法。你可以只创建适当的长度(vector("list",20))的空单并填写的要素,当您去:R是弱类型不够,它不会介意你lm对象替换NULL值。更惯用,不过,您可以将您的预测名单上运行lapply

my_data <- data.frame(result=rnorm(10), v1=rnorm(10), v2=rnorm(10)) 
prednames <- setdiff(names(my_data),"result") ## extract predictor names 
lapply(prednames, 
function(n) lm(reformulate(n,response="result"), 
       data=my_data)) 

或者,如果你不喜欢创建一个匿名函数,你可以首先生成公式(使用lapply)的列表,然后在它们上面运行lm

formList <- lapply(prednames,reformulate,response="result") ## create formulae 
lapply(formList,lm,data=my_data) ## run lm() on each formula in turn 

将创建lm对象作为上述第一种策略的同一列表。

一般来说,避免在建模公式中使用诸如my_data$result之类的语法是一种好的做法;相反,尝试设置一些东西,以便模型中的所有变量都是从data对象中抽取的。这样的方式,如predictupdate更可能正常工作...