为什么我在 predict.lm "variable lengths differ" 中遇到错误?
Why I'm geeting an error in predict.lm "variable lengths differ"?
我正在尝试预测模型,但它显示错误:
Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) :
variable lengths differ (found for 'Welfare.Measurment')
测试和训练数据相似,变量名称和结构相同。我什至尝试 rbind
这两个数据帧,但错误仍然存在。
代码如下:
model3 <- lm(log(Poverty.Line.Day) ~ (log(data_abs$Median)) +
Welfare.Measurment + Control, data=data_abs)
predicted_poverty_Line <-
exp(predict(model3, dataF))*exp((summary(model3)$sigma)^2/2)
在lm
中,当使用data=
参数时,不要在公式中使用$
。
fit1 <- lm(y ~ train$X1 + X2, data=train) ## predict will fail
predict(fit1, newdata=test)
# Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = obje
# ct$xlevels) :
# variable lengths differ (found for 'X2')
fit2 <- lm(y ~ X1 + X2, data=train) ## predict will work
predict(fit2, newdata=test)
原因: 如果您使用例如公式中的train$X1
,变量将是固定的,即使你在predict
中提供newdata=
,也会使用旧值。如果矢量不是偶然的相同长度,你会得到这个错误。
数据:
n <- 60
set.seed(42)
dat <- data.frame(X1=rnorm(n), X2=rnorm(n))
dat <- transform(dat, y=1 + X1 + rnorm(n))
train <- dat[1:20, ]
test <- dat[21:n, ]
我正在尝试预测模型,但它显示错误:
Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) :
variable lengths differ (found for 'Welfare.Measurment')
测试和训练数据相似,变量名称和结构相同。我什至尝试 rbind
这两个数据帧,但错误仍然存在。
代码如下:
model3 <- lm(log(Poverty.Line.Day) ~ (log(data_abs$Median)) +
Welfare.Measurment + Control, data=data_abs)
predicted_poverty_Line <-
exp(predict(model3, dataF))*exp((summary(model3)$sigma)^2/2)
在lm
中,当使用data=
参数时,不要在公式中使用$
。
fit1 <- lm(y ~ train$X1 + X2, data=train) ## predict will fail
predict(fit1, newdata=test)
# Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = obje
# ct$xlevels) :
# variable lengths differ (found for 'X2')
fit2 <- lm(y ~ X1 + X2, data=train) ## predict will work
predict(fit2, newdata=test)
原因: 如果您使用例如公式中的train$X1
,变量将是固定的,即使你在predict
中提供newdata=
,也会使用旧值。如果矢量不是偶然的相同长度,你会得到这个错误。
数据:
n <- 60
set.seed(42)
dat <- data.frame(X1=rnorm(n), X2=rnorm(n))
dat <- transform(dat, y=1 + X1 + rnorm(n))
train <- dat[1:20, ]
test <- dat[21:n, ]