R - 分割数据、回归并将方程应用于新的分割数据集

标签 r split apply

我有一个包含旧数据和新数据的大型数据集。我创建了两个数据框,EarlyYears 使用旧数据,LaterYears 使用新数据,因此它们具有相同的列。

我想要做的是回归早年的数据以确定一个方程并将其应用于晚年以测试方程的强度 - A 和 B 是常数,输入是我正在测试的 - 我将其更改为不同的运行代码 - 如果没有输入数据,则 Dummy 为 1。但是,我想将 EarlyYears 和 LaterYears 数据按其中一个变量的五分位数拆分,并将 EarlyYears 的五分位数 1 中找到的方程应用于五分位数 1 中的 LaterYears 数据。我对 R 相当陌生,到目前为止有:

Model<-data.frame(Date = rep(c("3/31/09","3/31/11"),each = 20), 
InputRating = rep(c(1:5), 8), Dummy = rep(c(rep(0,9),1),4),
Y = rep(1,3,5,7,11,13,17,19), A = 1:40,B = 1:40*3+7)
newer<-as.numeric(grep("/11",Model$Date))
later<-as.numeric(grep("/11",Model$Date,invert = TRUE))

LaterYears<-Model[newer,]
EarlyYears<-Model[later,]
newModel<-EarlyYears

DataSet.Input<-data.frame(Date = newModel$Date, InputRating = newModel$InputRating, 
Dummy = newModel$Dummy, Y = newModel$Y, A = newModel$A,B = newModel$B)
quintiles<-quantile(DataSet.Input$A,probs=c(0.2,0.4,0.6, 0.8, 1.0))
VarQuint<-findInterval(DataSet.Input$A,quintiles,rightmost.closed=TRUE)+1L

regressionData<-do.call(rbind,lapply(split(DataSet.Input,VarQuint),
FUN = function(SplitData) { 
SplitRegression<-lm(Y ~ A + B + InputRating + Dummy, data = SplitData, na.action = na.omit) 
c(coef.Intercept = coef(summary(SplitRegression))[1],
coef.A = coef(summary(SplitRegression))[2], 
coef.B = coef(summary(SplitRegression))[3],
coef.Input = coef(summary(SplitRegression))[4],
coef.Dummy= coef(summary(SplitRegression))[5])
}))

i = 0
quintiles.LY<-quantile(LaterYears$A,probs=c(0.2,0.4,0.6, 0.8, 1.0))
Quint.LY<-findInterval(LaterYears$A,quintiles,rightmost.closed=TRUE)+1L

LaterYears$ExpectedValue <-apply(split(LaterYears,Quint.LY),1,
FUN = function(SplitData) {
  i=i+1
  regressionData[i,1]+regressionData[i,2]*SplitData$A +
  regressionData[i,3]*SplitData$B + regressionData[i,4]*SplitData$Input +
  regressionData[i,5]*SplitData$Dummy    
})

第一部分非常适合获取回归数据中的数据。我希望将应用方程的结果保存在 LaterYears 数据集中的一列中,但出现错误 -

Error in apply(split(LaterYears, Quint.LY), 1, FUN = function(SplitData) { :
dim(X) must have a positive length

当使用 apply 运行时,当使用 lapply 运行时为空白,这是我最初尝试的。

任何有关如何解决此问题的帮助将不胜感激! 谢谢!

最佳答案

也许像这样,使用predict会更好。它对于您的示例数据效果不太好,但它可能适用于真实数据。

# by, splits a dataset by a factor
regressionData <- by(DataSet.Input,VarQuint,
                     function(d) {
                       lm1 <- lm(Y ~ A + B + InputRating + Dummy, d)
                     })

quintiles.LY<-quantile(LaterYears$A,probs=seq(0,1,0.2))
Quint.LY<-findInterval(LaterYears$A,quintiles,rightmost.closed=TRUE)+1L

LaterYearsPredict <- split(LaterYears,Quint.LY)

# lapply's arguments can be anything that is a sequence
LaterYears$ExpectedValue <- unlist(lapply(1:length(LaterYearsPredict),
       function(x) 
         predict(regressionData[[x]],LaterYearsPredict[[x]])
       ))

关于R - 分割数据、回归并将方程应用于新的分割数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15009272/

相关文章:

r - 在数据框中的跨行序列中查找元素

r - 将负二项式模型预测为具有偏移项的栅格

r - 从线性回归中提取 p 值和 r 平方

sql - T-SQL 将字符串拆分为多对一关系?

javascript - 根据对象中的值将对象数组拆分为两个

Java:字符串分割

r - 在 R 中,提取后续列为 max 的第 1 列的值

r - 修改字符串后如何重置向量的因子?

r - 性能考虑 data.table 中的 get()

lisp - 为什么函数应用会提示长列表?