我正在尝试从一组在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))})
答案 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
排列数据的可能更简单的方法,这样可以避免列表的列表 - 您的方法的输出结构。使用broom
和dplyr
,您可以在数据框中收集模型的输出,以便于访问。例如,看一下
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