为什么 R 中的 LM 预测函数会在我的输出中添加一行
Why would the LM Prediction function in R add a row to my output
我正在尝试使用基于基本线性模型的 R 中的预测函数。我的测试集有 1459 个值,但是当我使用预测函数时,它创建了 1460 个值。我尝试从测试集中删除 NA,甚至尝试保留它们,但不知道这个值是从哪里来的。
如有任何帮助,我们将不胜感激。
谢谢!
MODEL <- lm(train$SalePrice ~ train$LotArea * train$GarageArea *
factor(train$FullBath) * train$YearBuilt * factor(train$OverallQual))
test_final <-read.csv("/Users/ERIC/Documents/HOUSING_PRICES/test.csv",
header = TRUE)
na.omit(test_final)
prediction <- data.frame(predict(MODEL, test_final))
Warning messages:
1: 'newdata' had 1459 rows but variables found have 1460 rows
2: In predict.lm(MODEL, test_final) :
prediction from a rank-deficient fit may be misleading
数据来自:https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data
首先,请注意:您必须重新分配 na.omit()
的输出以去除缺失值。
看这里:
df <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA))
df
x y
1 1 0
2 2 10
3 3 NA
na.omit(df)
x y
1 1 0
2 2 10
df
x y
1 1 0
2 2 10
3 3 NA
如您所见,最后一次调用 df
向您展示了包含 NA
的初始版本。您将需要使用 df <- na.omit(df)
重新分配。
实际问题:
正如@42在评论中所指出的,正确使用公式将解决这个问题,即你不会再有这个错误信息了。但是,您将拥有一个不同的。首先,让我告诉你:
#read in the data
testdf <- read.csv("test.csv")
train <- read.csv("train.csv")
# run initial model, and run model as suggested by 42
model_original <- lm(train$SalePrice ~ train$LotArea * train$GarageArea * factor(train$FullBath) * train$YearBuilt * factor(train$OverallQual))
mod_42 <- lm(SalePrice ~ LotArea * GarageArea * factor(FullBath) * YearBuilt * factor(OverallQual), data = train)
现在,让我们运行预测:
prediction <- data.frame(predict(model_original, testdf))
Warning messages:
1: 'newdata' had 1459 rows but variables found have 1460 rows
2: In predict.lm(model_original, testdf) :
prediction from a rank-deficient fit may be misleading
这导致了与您相同的错误。现在,让我们 运行 使用第二种方法进行预测:
prediction <- data.frame(predict(mod_42, testdf))
Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) :
factor factor(FullBath) has new levels 4
请注意,现在的错误信息有所不同,指向了一个更有趣的问题。
我正在尝试使用基于基本线性模型的 R 中的预测函数。我的测试集有 1459 个值,但是当我使用预测函数时,它创建了 1460 个值。我尝试从测试集中删除 NA,甚至尝试保留它们,但不知道这个值是从哪里来的。
如有任何帮助,我们将不胜感激。 谢谢!
MODEL <- lm(train$SalePrice ~ train$LotArea * train$GarageArea *
factor(train$FullBath) * train$YearBuilt * factor(train$OverallQual))
test_final <-read.csv("/Users/ERIC/Documents/HOUSING_PRICES/test.csv",
header = TRUE)
na.omit(test_final)
prediction <- data.frame(predict(MODEL, test_final))
Warning messages:
1: 'newdata' had 1459 rows but variables found have 1460 rows
2: In predict.lm(MODEL, test_final) :
prediction from a rank-deficient fit may be misleading
数据来自:https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data
首先,请注意:您必须重新分配 na.omit()
的输出以去除缺失值。
看这里:
df <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA))
df
x y
1 1 0
2 2 10
3 3 NA
na.omit(df)
x y
1 1 0
2 2 10
df
x y
1 1 0
2 2 10
3 3 NA
如您所见,最后一次调用 df
向您展示了包含 NA
的初始版本。您将需要使用 df <- na.omit(df)
重新分配。
实际问题:
正如@42在评论中所指出的,正确使用公式将解决这个问题,即你不会再有这个错误信息了。但是,您将拥有一个不同的。首先,让我告诉你:
#read in the data
testdf <- read.csv("test.csv")
train <- read.csv("train.csv")
# run initial model, and run model as suggested by 42
model_original <- lm(train$SalePrice ~ train$LotArea * train$GarageArea * factor(train$FullBath) * train$YearBuilt * factor(train$OverallQual))
mod_42 <- lm(SalePrice ~ LotArea * GarageArea * factor(FullBath) * YearBuilt * factor(OverallQual), data = train)
现在,让我们运行预测:
prediction <- data.frame(predict(model_original, testdf))
Warning messages:
1: 'newdata' had 1459 rows but variables found have 1460 rows
2: In predict.lm(model_original, testdf) :
prediction from a rank-deficient fit may be misleading
这导致了与您相同的错误。现在,让我们 运行 使用第二种方法进行预测:
prediction <- data.frame(predict(mod_42, testdf))
Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) :
factor factor(FullBath) has new levels 4
请注意,现在的错误信息有所不同,指向了一个更有趣的问题。