Как использовать lapply в data.table без предложения by - PullRequest
4 голосов
/ 21 сентября 2019

Я пытаюсь использовать data.table, lapply и вызов функции для запуска нескольких регрессий для одной и той же переменной.Я хотел бы получить простую таблицу в качестве вывода, показывающую каждую переменную и коэффициент детерминации для каждой.

Я использую Rstudio 1.2.1335, data.table 1.12.2 Я использую набор данных "http://users.stat.ufl.edu/~rrandles/sta4210/Rclassnotes/data/textdatasets/KutnerData/Appendix%20C%20Data%20Sets/APPENC02.txt"

cnames<-c("ID","County","State","Area","Pop","Young","Old","Phys","Beds","Crime","HighSchool","BA","Poverty","Unemploy","PerCapitaIncome","TotalIncome","Region")
df62<-fread("APPENC02.txt", col.names=cnames)
df62[,c("ID", "County","State","Region"):=NULL]
variability<-function(y){
     model<-eval(substitute(lm(Phys~y, data=df62)))
     anova<-anova(model)
     SSR<- anova$`Sum Sq`[1]
     SSE<- anova$`Sum Sq`[2]
     SSTO<-SSR+SSE
     R2<-SSR/SSTO
     return(R2)
}
df62[ , lapply(.SD, variability)]

Это работает, если последняя строка:

df62[ , lapply(.SD, Variability), by=Phys]

Сообщение об ошибке, когда я опускаю предложение «by»: «Ошибка в (функция (x,i, точный) if (is.matrix (i)) as.matrix (x) [[i]] else .subset2 (x,: объект 'i' не найден "

Если я группапо переменной Phys я получаю правильные результаты, но каждый результат повторяется без необходимости.

1 Ответ

4 голосов
/ 21 сентября 2019

Мы можем создать выражение с reformulate.Здесь мы можем передать два аргумента, 'data' и 'y', а y будет принимать имена столбцов в качестве аргументов.

variability<-function(data, y){
     model<- lm(reformulate(y, "Phys"), data=data)
     anova<-anova(model)
     SSR<- anova$`Sum Sq`[1]
     SSE<- anova$`Sum Sq`[2]
     SSTO<-SSR+SSE
     R2<-SSR/SSTO
     return(R2)
}

Выберите интересующие имена столбцов

nm1 <- setdiff(names(df62), "Phys")

Loopчерез них примените функцию, пока data равно .SD

setnames(df62[, lapply(nm1, variability, data = .SD)], nm1)[]
#    Area       Pop      Young          Old      Beds     Crime   HighSchool         BA     Poverty    Unemploy PerCapitaIncome TotalIncome
#1: 0.006095652 0.8840674 0.01432791 9.788323e-06 0.9033826 0.6731538 1.804622e-05 0.05605789 0.004113459 0.002551878       0.0999411   0.8989137

data

cnames<-c("ID","County","State","Area","Pop","Young","Old","Phys","Beds","Crime","HighSchool","BA","Poverty","Unemploy","PerCapitaIncome","TotalIncome","Region")

df62 <- fread("http://users.stat.ufl.edu/~rrandles/sta4210/Rclassnotes/data/textdatasets/KutnerData/Appendix%20C%20Data%20Sets/APPENC02.txt", col.names = cnames)
df62[,c("ID", "County","State","Region"):=NULL]
...