如何在 R 的 "with" 基数中编码删除 NA
How to code remove NA in "with" base in 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)
但并不认为tag.Thedataframe pdat是使用面板数据回归分析的面板数据集。 a1、a2、a11、a12 是特定回归的系数。 pdat 有一些缺失的数据,我相信由于 pdat 中缺失的数据,这个 pdat$mpLab 为每次观察给出了 NA。
如果有人能帮助我,我将不胜感激。
您正在使用 +
计算行向总和,为此有一个特殊函数 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
我不完全确定这就是你所指的问题,但这绝对是你提交的代码中的一个问题:一些模型系数的索引没有正确输入,它们缺少一些 space 字符。当索引不存在时,返回 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)
确实填充了数据框。
希望这就是你想要的
我的简单数据集如下所示。
+--------+------+--------+-----+-----+ | 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)
但并不认为tag.Thedataframe pdat是使用面板数据回归分析的面板数据集。 a1、a2、a11、a12 是特定回归的系数。 pdat 有一些缺失的数据,我相信由于 pdat 中缺失的数据,这个 pdat$mpLab 为每次观察给出了 NA。
如果有人能帮助我,我将不胜感激。
您正在使用 +
计算行向总和,为此有一个特殊函数 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
我不完全确定这就是你所指的问题,但这绝对是你提交的代码中的一个问题:一些模型系数的索引没有正确输入,它们缺少一些 space 字符。当索引不存在时,返回 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)
确实填充了数据框。
希望这就是你想要的