Как закодировать удаление NA с базой в R

Мой простой набор данных выглядит следующим образом.

+--------+------+--------+-----+-----+
|  Time  | Firm |  Out   | Lab | Cap |
+--------+------+--------+-----+-----+
| Jan-00 | A    | 161521 | 261 | 13  |
| Feb-00 | A    | 142452 | 334 | 15  |
| Mar-00 | A    | 365697 | 156 | 14  |
| Apr-00 | A    | 355789 | 134 | 12  |
| May-00 | A    | 376843 | 159 | 15  |
| Jun-00 | A    | 258762 | 119 | 12  |
| Jul-00 | A    | 255447 | 41  | 45  |
| Aug-00 | A    | 188545 | 247 | 75  |
| Sep-00 | A    | 213663 | 251 | NA  |
| Oct-00 | A    | 273209 | 62  | 12  |
| Nov-00 | A    | 317468 | 525 | 15  |
| Dec-00 | A    | 238668 | 217 | 16  |
| Jan-01 | B    | 241286 | 298 | 42  |
| Feb-01 | B    | 135288 | 109 | 45  |
| Mar-01 | B    | 363609 | 7   | 24  |
| Apr-01 | B    | 318472 | NA  | 56  |
| May-01 | B    | 446279 | 0   | 12  |
| Jun-01 | B    | 390230 | 50  | 12  |
| Jul-01 | B    | 118945 | 143 | 45  |
| Aug-01 | B    | 174887 | 85  | NA  |
| Sep-01 | B    | 183770 | 80  | 15  |
| Oct-01 | B    | 197832 | 214 | 12  |
| Nov-01 | B    | 317468 | 525 | 15  |
| Dec-01 | B    | 238668 | 217 | 16  |
+--------+------+--------+-----+-----+

Приведенный выше набор данных можно воспроизвести с помощью следующего кода.

    structure(list(Time = structure(c(9L, 7L, 15L, 1L, 17L, 13L, 
    11L, 3L, 23L, 21L, 19L, 5L, 10L, 8L, 16L, 2L, 18L, 14L, 12L, 
    4L, 24L, 22L, 20L, 6L), .Label = c("Apr-00", "Apr-01", "Aug-00", 
    "Aug-01", "Dec-00", "Dec-01", "Feb-00", "Feb-01", "Jan-00", "Jan-01", 
    "Jul-00", "Jul-01", "Jun-00", "Jun-01", "Mar-00", "Mar-01", "May-00", 
    "May-01", "Nov-00", "Nov-01", "Oct-00", "Oct-01", "Sep-00", "Sep-01"
    ), class = "factor"), Firm = structure(c(1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), Out = c(161521L, 
    142452L, 365697L, 355789L, 376843L, 258762L, 255447L, 188545L, 
    213663L, 273209L, 317468L, 238668L, 241286L, 135288L, 363609L, 
    318472L, 446279L, 390230L, 118945L, 174887L, 183770L, 197832L, 
    317468L, 238668L), Lab = c(261L, 334L, 156L, 134L, 159L, 119L, 
    41L, 247L, 251L, 62L, 525L, 217L, 298L, 109L, 7L, NA, 0L, 50L, 
    143L, 85L, 80L, 214L, 525L, 217L), Cap = c(13L, 15L, 14L, 12L, 
    15L, 12L, 45L, 75L, NA, 12L, 15L, 16L, 42L, 45L, 24L, 56L, 12L, 
    12L, 45L, NA, 15L, 12L, 15L, 16L)), .Names = c("Time", "Firm", 
    "Out", "Lab", "Cap"), class = "data.frame", row.names = c(NA, 
    -24L))

Сначала я получаю структуру панели для регрессии данных панели, используя следующую команду

    library(zoo)
    library(plm)

    Sys.setlocale("LC_TIME", "English")
    dat["time1"] <- as.yearmon(dat$Time,format="%b-%y")
    pdat <-pdata.frame(dat,index=c("Firm","time1"))

Теперь запустите регрессию

    Model1<- plm(Out ~ Lab+Cap+I(0.5*(Lab^2))
                +I(0.5*(Cap^2))+I(Lab*Cap),data=pdat)
    summary(Model1)

Затем создаются короткие пути для полученных оценок, как показано ниже.

    a1 <- coef( Model1 )[ "Lab" ]
    a2 <- coef( Model1 )["Cap"]
    a11 <- coef( Model1  )[ "I(0.5*(Lab^2))" ]
    b22 <- coef( Model1  )[ "I(0.5*(Cap^2))" ]
    a12 <-a21<- coef( Model1  )[ "I(Lab*Cap)" ]

    pdat$mpLab <- with( pdat,+ a1 + a11 * a1 + a12*a2)

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

    pdat$mpLab <- with( pdat,+ a1 + a11 * a1 + a12*a2,na.rm=TRUE)

Но он не принимает этот тег. Dataframe pdat представляет собой набор панельных данных, проанализированный с использованием регрессии панельных данных. a1, a2,a11,a12 — коэффициенты конкретной регрессии. В pdat есть некоторые отсутствующие данные, и я считаю, что эта pdat$mpLab дает NA для каждого наблюдения из-за этих отсутствующих данных в pdat.

Очень признателен, если кто-нибудь может мне помочь.


person Doo    schedule 13.01.2016    source источник
comment
Было бы здорово, если бы вы могли предоставить минимальный воспроизводимый пример, соответствующий вашему вопросу. Что-то, с чем мы можем работать и использовать, чтобы показать вам, как можно ответить на ваш вопрос. Таким образом, другие могут также сформировать ваш вопрос и сопровождающий ответ в будущем. Вы можете посмотреть эту запись SO о том, как сделать отличный воспроизводимый пример в R.   -  person Eric Fail    schedule 14.01.2016
comment
Как вы хотите относиться к этим NA? Заменить их нулями?   -  person Marat Talipov    schedule 14.01.2016
comment
Вы можете попробовать rowSums(with(pdat, cbind(a1, a11*a1, a12*a2)), na.rm = TRUE)   -  person talat    schedule 14.01.2016
comment
@Eric Fail, я отредактировал свой вопрос   -  person Doo    schedule 14.01.2016
comment
@Marat Talipov _ нет, я хочу оставить пропущенные значения как есть, а не заменять их нулем.   -  person Doo    schedule 14.01.2016


Ответы (2)


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

Когда я использовал правильный набор текста:

a1 <- coef( Model1 )[ "Lab" ]
a2 <- coef( Model1 )["Cap"]
a11 <- coef( Model1  )[ "I(0.5 * (Lab^2))" ]
b22 <- coef( Model1  )[ "I(0.5 * (Cap^2))" ]
a12 <-a21<- coef( Model1  )[ "I(Lab * Cap)" ]

Я получил все коэффициенты, имеющие значения, и

pdat$mpLab <- with( pdat,+ a1 + a11 * a1 + a12*a2)

заполнил фрейм данных.

Надеюсь, это то, что ты хочешь

person HubertL    schedule 14.01.2016
comment
Да, это работает с вашей исправлением кода для моего простого набора данных, но все еще не с моим большим набором данных. - person Doo; 15.01.2016
comment
@Doo, тогда вам придется создать тестовый набор данных, который воспроизводит - person HubertL; 15.01.2016
comment
Я понял. Как вы указали, это была проблема с пробелом в коде. - person Doo; 15.01.2016

Вы используете + для вычисления построчных сумм, и для этого есть специальная функция rowSums, которая также имеет аргумент na.rm =. Я использую cbind, создаю матрицу столбцов, которые вы хотите суммировать, а затем применяю rowSums(..., na.rm = TRUE), чтобы это могло выглядеть так:

pdat$earea <- rowSums(with(pdat, cbind(a1, a11*a1, a12*a2)), na.rm = TRUE) 

Вот пример с некоторыми поддельными данными:

set.seed(1)
x <- data.frame(a1 = c(1:4, NA), a11 = sample(5), a12 = c(NA, 2:5), a2 = sample(5))
x$check <- rowSums(with(x, cbind(a1, a11*a1, a12*a2)), na.rm = TRUE) 
x
#  a1 a11 a12 a2 check
#1  1   2  NA  5     3
#2  2   5   2  4    20
#3  3   4   3  2    21
#4  4   3   4  3    28
#5 NA   1   5  1     5
person talat    schedule 13.01.2016
comment
@docendo discimus Я отредактировал свой вопрос с кодами и набором данных. - person Doo; 14.01.2016