全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
2385 1
2017-05-03
查了很多资料,都没有解决,所以请教各位大神,在此先谢过啦^_^

以下程序当执行到最后部分时,提示如下错误:
Error in if (loss.old <= loss.new) { : missing value where TRUE/FALSE needed

以下是程序的部分代码,代码中报错部分,在程序中也“标红”了

原始代码 Rcode20170503.R和数据 data20170503.csv如附件所示


#code to replicate analysis of Lalonde data
rm(list=ls())
library(foreign)
library(Matching)
library(survey)
library(lattice)
# package that implements entropy balancing
library(ebal)


dat <- read.table("data20170503.csv",header=T)
# unemployed
dat$u74 <- as.numeric(dat$re74==0)
dat$u75 <- as.numeric(dat$re75==0)


# covars
covars <- c("age","educ","black","hispan","married","nodegree","re74","re75","u74","u75")


# compute all interactions
X <- as.matrix(dat[,covars])
XX <- matrixmaker(X)


# prepare data: exclude non-sensical and co-linear vars, code treatment and outcome, change names
out <- c("black.black","nodegree.nodegree","nodegree.educ","married.married","hispan.hispan","hispan.black",
         "u75.u75","u74.u74","u74.re74","u75.re75","u74.re74","u75.re75","re74.re74","re75.re75","re75.re74")


XX     <- XX[,(colnames(XX) %in% out)==F]
dat    <- data.frame(dat[,(names(dat) %in% covars)==F],XX)
covars <- names(dat)[-which((names(dat) %in% c("treat","re78")))]
X     <- dat[,covars]
X     <- as.matrix(X)
colnames(X) <-gsub(".age","*Age",colnames(X))
colnames(X) <-gsub(".educ*","*Schooling",colnames(X))
colnames(X) <-gsub(".black","*Black",colnames(X))
colnames(X) <-gsub(".hispan","*Hispanic",colnames(X))
colnames(X) <-gsub(".married","*Married",colnames(X))
colnames(X) <-gsub(".re74","*Earnings 1974",colnames(X))
colnames(X) <-gsub(".re75","*Earnings 1975",colnames(X))
colnames(X) <-gsub(".u74","*Unemployed 1974",colnames(X))
colnames(X) <-gsub(".u75","*Unemployed 1975",colnames(X))
colnames(X) <-gsub(".nodegree","*HS Dropout",colnames(X))
colnames(X) <-gsub("age","Age",colnames(X))
colnames(X) <-gsub("educ","Schooling",colnames(X))
colnames(X) <-gsub("black","Black",colnames(X))
colnames(X) <-gsub("hispan","Hispanic",colnames(X))
colnames(X) <-gsub("married","Married",colnames(X))
colnames(X) <-gsub("re74","Earnings 1974",colnames(X))
colnames(X) <-gsub("re75","Earnings 1975",colnames(X))
colnames(X) <-gsub("u74","Unemployed 1974",colnames(X))
colnames(X) <-gsub("u75","Unemployed 1975",colnames(X))
colnames(X) <-gsub("nodegree","HS Dropout",colnames(X))
dat <- data.frame(dat,X)
Y <- dat$re78
W <- dat$tr


#  balance before matching
bout.nm   <- MatchBalance(W~X,match.out = NULL,ks=FALSE)
bal.nm <- baltest.collect(matchbal.out=bout.nm ,var.names=colnames(X),after=FALSE)
round(bal.nm,3)


# Maha Dist Matching
mout.maha  <-  Match(Y,W,X,BiasAdjust=F,estimand="ATT",M=1)
summary(mout.maha)
bout.maha  <- MatchBalance(W~X,match.out = mout.maha,ks=FALSE)
bal.maha <- baltest.collect(matchbal.out=bout.maha ,var.names=colnames(X),after=TRUE)
round(bal.maha,3)


# Genetic Matching ATT
g.weights <- GenMatch(Tr=W, X=X, BalanceMatrix=X, estimand="ATT", M=1,print.level=0)
mout.gm <-  Match(Y,W,X,BiasAdjust=F,Weight.matrix=g.weights,estimand="ATT",M=1)
summary(mout.gm)
bout.gm <- MatchBalance(W~X,match.out = mout.gm,print.level=0,ks=FALSE)
bal.gm <- baltest.collect(matchbal.out=bout.gm,var.names=colnames(X),after=TRUE)
round(bal.gm,3)


## Logistic PS weighting + matching
PS  <- glm(W~X,family=binomial(link=logit))$fitted
PSM <- PS
PS  <- PS[W==0]
PS  <- PS/(1-PS)


# PS Matching
mout.psm <-  Match(Y,W,X=PSM,BiasAdjust=F,estimand="ATT",M=1)
summary(mout.psm)
bout.psm <- MatchBalance(W~X,match.out = mout.psm,print.level=0,ks=FALSE)
bal.psm  <- baltest.collect(matchbal.out=bout.psm,var.names=colnames(X),after=TRUE)
round(bal.psm,3)


# PS Weighting
bout.psw <- MatchBalance(W~X,weights=c(W[W==1],PS),ks=FALSE)
bal.psw <- baltest.collect(matchbal.out=bout.psw,var.names=colnames(X),after=FALSE)
round(bal.psw,2)


# Entropy Balancing
out.eb <- ebalance(
              Treatment=W,
              X=X
              )
           
bout.eb <- MatchBalance(W~X,weights=c(W[W==1],out.eb$w),ks=FALSE)
bal.eb  <- baltest.collect(matchbal.out=bout.eb,var.names=colnames(X),after=F)
round(bal.eb,2)

# Entropy Balancing (with trimmed weights)
out.ebtr <- ebalance.trim(         
               ebalanceobj=out.eb,
              )

附件列表

原始代码和数据.rar

大小:117.07 KB

 马上下载

原始代码和数据

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2017-5-4 09:20:18
此链接国外一个网站对类似问题的一个解释:http://stackoverflow.com/questions/7355187/error-in-if-while-condition-missing-value-where-true-false-needed

但仍然没有解决我的问题:因为我根本没办法定位 if (loss.old <= loss.new) 这个条件语句在什么地方,并且变量loss.oldloss.new无论在原始数据中还是在代码里都没有出现过。



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群