我正在进行线性回归,其中预测变量被另一个值分类,并且无法为newdata生成建模响应。
首先,我为预测变量和误差项生成一些随机值。然后我构建了响应。请注意,预测变量的系数取决于分类变量的值。我根据预测变量及其类别编写了一个设计矩阵。
set.seed(1)
category = c(rep("red", 5), rep("blue",5))
x1 = rnorm(10, mean = 1, sd = 1)
err = rnorm(10, mean = 0, sd = 1)
y = ifelse(category == "red", x1 * 2, x1 * 3)
y = y + err
df = data.frame(x1 = x1, category = category)
dm = as.data.frame(model.matrix(~ category + 0, data = df))
dm = dm * df$x1
fit = lm(y ~ as.matrix(dm) + 0, data = df)
# This line will not produce a warning
predictOne = predict.lm(fit, newdata = dm)
# This line WILL produce a warning
predictTwo = predict.lm(fit, newdata = dm[1:5,])
警告是:
'newdata'有5行,但找到的变量有10行
除非我非常错误,否则我不应该对变量名称有任何问题。 (在这个板上有一两个讨论提出了这个问题。)请注意,第一个预测运行正常,但第二个预测没有。唯一的变化是第二次预测仅使用设计矩阵的前五行。
思想?
答案 0 :(得分:4)
我不是百分之百地确定你要做的是什么,但我认为对公式如何运作的简短介绍将为你解决问题。
基本思想很简单:你传递两个东西,一个公式和一个数据框。公式中的术语 all 应该是数据框中变量的名称。
现在,您可以让lm
无法完全遵循该指南,但您只是要求出错。因此,请停下来查看您的模型规格,并考虑R在哪里寻找东西。
当您致电lm
时,基本上没有公式中的任何名称在数据框df
中找到。所以我怀疑df
根本就没用过。
然后,如果你打电话给model.frame(fit)
,你会看到R认为应该调用你的变量。注意什么奇怪的?
model.frame(fit)
y as.matrix(dm).categoryblue as.matrix(dm).categoryred
1 2.2588735 0.0000000 0.3735462
2 2.7571299 0.0000000 1.1836433
3 -0.2924978 0.0000000 0.1643714
4 2.9758617 0.0000000 2.5952808
5 3.7839465 0.0000000 1.3295078
6 0.4936612 0.1795316 0.0000000
7 4.4460969 1.4874291 0.0000000
8 6.1588103 1.7383247 0.0000000
9 5.5485653 1.5757814 0.0000000
10 2.6777362 0.6946116 0.0000000
as.matrix(dm).categoryblue
中有dm
名吗?是的,我不这么认为。
我怀疑(但不确定)你打算做更多这样的事情:
df$y <- y
fit <- lm(y~category - 1,data = df)
答案 1 :(得分:2)
乔兰走在正确的轨道上。该问题与列名有关。我想要做的是创建我自己的设计矩阵,事实上,我不需要这样做。如果使用以下代码行运行模型,那就顺利了:
fit = lm(y ~ x1:category + 0, data = df)
该公式名称将取代设计矩阵的手动构造。
使用我自己的设计矩阵是我过去所做的事情,适合的参数和诊断就像它们应该的那样。我没有使用预测功能,因此从未知道R正在丢弃“data =”参数。警告会很酷。 R是个苛刻的情妇。
答案 2 :(得分:1)
这可能会有所帮助。将新数据转换为@NonNull
@Override
public Single<List<Review>> getReviews() {
return appCredentialsSource
.getAppCredentials()
.firstOrError()
.flatMap(flo -> appNetworkSource.professionalsReview(flo.getApiKey());
}
,例如:
data.frame