R извлекает коэффициенты регрессии из кратной регрессии с помощью команды lapply - PullRequest
2 голосов
/ 26 января 2012

У меня большой набор данных с несколькими переменными, одна из которых является переменной состояния, закодированной 1-50 для каждого состояния. Я хотел бы запустить регрессию из 28 переменных на оставшихся 27 переменных набора данных (всего 55 переменных), и для каждого состояния.

Другими словами, запустите регрессию переменной1 на ковариате1, ковариате2, ..., ковариате27 для наблюдений, где состояние == 1. Затем я хотел бы повторить это для variable1 для состояний 2-50 и повторить весь процесс для variable2, variable3, ..., variable28.

Я думаю, что написал правильный код R для этого, но следующее, что я хотел бы сделать, - это извлечь коэффициенты, в идеале, в матрицу коэффициентов. Может ли кто-нибудь помочь мне с этим? Вот код, который я написал до сих пор:

for (num in 1:50) {

    #PUF is the data set I'm using

    #Subset the data by states
    PUFnum <- subset(PUF, state==num)

    #Attach data set with state specific data
    attach(PUFnum)

    #Run our prediction regression
    #the variables class1 through e19700 are the 27 covariates I want to use
    regression <- lapply(PUFnum,  function(z) lm(z ~ class1+class2+class3+class4+class5+class6+class7+
                                                     xtot+e00200+e00300+e00600+e00900+e01000+p04470+e04800+
                                                     e09600+e07180+e07220+e07260+e06500+e10300+
                                                     e59720+e11900+e18425+e18450+e18500+e19700))

    Beta <- lapply(regression, function(d) d<- coef(regression$d))


    detach(PUFnum)
}

Ответы [ 2 ]

5 голосов
/ 27 января 2012

Это еще один пример классической проблемы Split-Apply-Combine, которую можно решить с помощью пакета plyr от @hadley. В вашей проблеме вы хотите

  1. Разделить фрейм данных по состоянию
  2. Применение регрессий для каждого подмножества
  3. Объединить коэффициенты во фрейм данных.

Я проиллюстрирую это набором данных Cars93, доступным в библиотеке MASS. Мы заинтересованы в выяснении отношений между horsepower и enginesize на основе origin страны.

# LOAD LIBRARIES
require(MASS); require(plyr)

# SPLIT-APPLY-COMBINE
regressions <- dlply(Cars93, .(Origin), lm, formula = Horsepower ~ EngineSize)
coefs <- ldply(regressions, coef)

   Origin (Intercept) EngineSize
1     USA    33.13666   37.29919
2 non-USA    15.68747   55.39211

EDIT. Например, замените PUF на Cars93, state на Origin и fm на формулу

1 голос
/ 26 января 2012

Я немного очистил ваш код:

fm <- z ~ class1+class2+class3+class4+class5+class6+class7+
          xtot+e00200+e00300+e00600+e00900+e01000+p04470+e04800+
          e09600+e07180+e07220+e07260+e06500+e10300+
          e59720+e11900+e18425+e18450+e18500+e19700

PUFsplit <- split(PUF, PUF$state)
mod <- lapply(PUFsplit, function(z) lm(fm, data=z))

Beta <- sapply(mod, coef)

Если бы вы хотели, вы могли бы даже поместить все это в одну строку:

Beta <- sapply(lapply(split(PUF, PUF$state), function(z) lm(fm, data=z)), coef)
...