lm函数返回模型中的所有系数

时间:2016-03-16 15:03:22

标签: r

我正在尝试从一组在lapply下运行的模型中提取OLS系数:

问题是我的列表中并非所有子模型都具有所有级别,并且大部分时间我最终都将系数“超出范围”。例如,在下面的代码中,Reward2不存在“No Reward”选项,而result0 $ coef [3,1]将不受约束,因为没有报告第三个估计值。 问题:是否可以强制“lm”报告模型中指定的所有系数,即使没有可用的估计值?

我想向社区道歉,因为我没有在我之前的尝试中提供可重现的代码。自从我上次尝试以来,我通过在函数内检查是否存在特定估计来解决问题,但问题仍然存在,这里是代码:

RewardList<-c("Reward1","Reward2")
set.seed(1234)
GL<-rnorm(10)
RewardName<-rep(c("Reward1","Reward2"),each=5)
NoReward<-c(0,1,0,1,0,  0,0,0,0,0)
Under1<-  c(1,0,0,0,1,  0,1,0,1,0)
Above1<-  c(0,0,1,0,0,  1,0,1,0,1)

tinput<-as.data.frame(RewardName)
tinput<-cbind(tinput,GL,NoReward,Under1,Above1)

regMF <- lapply(seq_along(RewardList), 
function (n) {
tinput <- tinput[tinput$RewardName==RewardList[n],]
result0 <- summary(lm(GL~NoReward+Under1+Above1-1,tinput))
result1 <- result0$coef[1,1] #no rebate
result2 <- result0$coef[2,1]
result3 <- result0$coef[3,1]
return(list(result1,result2,result3))})

2 个答案:

答案 0 :(得分:1)

为了使您的功能更加强大,您可以使用tryCatch或使用dplyr::failwith。例如,替换

result0 <- summary(lm(GL~`No Reward`+`Under 1%`-1,tinput))

require(dplyr)
result0 <- failwith(NULL, summary(lm(GL~`No Reward`+`Under 1%`-1,tinput)))

可能会起作用,但如果没有可重复的示例则很难说清楚。关于如何制作可重复的示例,请查看here

虽然不完全是您的问题,但我想指出一种使用broom排列数据的可能更简单的方法,这样可以避免列表的列表 - 您的方法的输出结构。使用broomdplyr,您可以在数据框中收集模型的输出,以便于访问。例如,看一下

的输出
 library(dplyr) 
 library(broom)
 mtcars %>% group_by(gear) %>% do(data.frame(tidy(lm(mpg~cyl, data=.), conf.int=T)))

在这里,您也可以将lm函数包裹在failwith周围。

答案 1 :(得分:1)

正如我所说,使用lmList

library(nlme)
fits <- lmList(GL~NoReward+Under1+Above1-1 | RewardName, data = tinput)
coef(fits)

#         NoReward     Under1     Above1
#Reward1 -1.034134 -0.3889705  1.0844412
#Reward2        NA -0.5695960 -0.3102046