R语言predict函数无法生成失业者工资预测值的问题求助
解决方法
你遇到的问题是因为predict.selection()默认只返回就业样本的工资拟合值——毕竟模型的第二阶段(工资方程)是基于有工资数据的就业者估计的。要生成全数据集(包括失业者)的对数工资预测,有两种简单的实现方式:
方法一:指定newdata参数调用predict
直接在predict()中传入完整数据集作为newdata,函数会自动为所有样本计算预测值:
ml_restricted <- selection(employed ~ schooling + age + agesq + married, logwage ~ schooling + age + agesq, data) summary(ml_restricted) # 生成全样本预测 predML <- predict(ml_restricted, newdata = data, type = "response") # 合并到原数据集 data$predML <- predML # 用$赋值比cbind更稳妥,避免类型问题 employed2 <- ifelse(data$employed == 1, "employed", "unemployed") data$employed2 <- employed2
这里type="response"会直接返回对数工资的预测值(对应模型的线性预测结果,因为工资方程是对数形式)。
方法二:手动用模型系数计算
如果想更直观地控制计算过程,可以提取工资方程的系数,手动对全样本计算预测:
ml_restricted <- selection(employed ~ schooling + age + agesq + married, logwage ~ schooling + age + agesq, data) summary(ml_restricted) # 提取工资方程的系数(包括截距项) wage_coefficients <- coef(ml_restricted)[grepl("logwage", names(coef(ml_restricted)))] # 构造全样本的自变量矩阵(自动包含截距项) X_matrix <- model.matrix(~ schooling + age + agesq, data = data) # 计算对数工资预测 predML <- as.vector(X_matrix %*% wage_coefficients) # 合并到原数据集 data$predML <- predML employed2 <- ifelse(data$employed == 1, "employed", "unemployed") data$employed2 <- employed2
注意事项
- 两种方法得到的结果是一致的,第一种更简洁,第二种适合需要自定义计算逻辑的场景。
- 用
data$colname的方式赋值比cbind更安全,能避免因数据类型不匹配导致的列格式问题。
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

