在 R 点中指定以使用 lm() 和 predict() 进行交互和 as.factor vars 进行预测
Specifying in R points to predict using lm() and predict() with interactions and as.factor vars
我想根据在 R 中使用 lm() 估计的回归模型计算一些预测值。
要预测的点未包含在用于回归的数据集中--
尽管我认为它们可能与 NA 一起代表因变量。这在 SAS 中有效,但我不想在这种情况下使用。
下面的简单方法最初很适合我的简单目的。
myLm1 = lm(log(p) ~ u + v + w, data=myDat)
DatToPred1 = data.frame(u=72, v=20, w=85)
predict(myLm1, DatToPred1)
但是假设现在模型规范包括交互 x*y。台词
下面抛出一个错误。
myLm2 = lm(log(p) ~ u + v + w + x*y, data=myDat)
DatToPred2 = data.frame(u=72, v=20, w=85, x=1, y=45)
predict(myLm2, DatToPred2)
Error in data.frame(u=72, v=20, w=85, x=1, y=45, :
argument is missing, with no default
这看起来很奇怪,因为 lm() 可以找到 x 和 y 来形成 x*y,看起来像
predict() 或许可以做同样的事情。
顺便说一句,在 DatToPred2 的定义中包含 x*y 也会失败。
DatToPred2 = data.frame(u=72, v=20, w=85, x*y=45)
最后假设该模型已进一步扩充以包含一整套用于分类变量 z 的虚拟变量。
myLm3 = lm(log(p) ~ u + v + w + x*y + as.factor(z), data=myDat)
我不知道如何指定要估计的点的值。
此外,z 可以取大量 n 个值,并且列出对应于要预测的特定点的虚拟变量的所有值将是乏味的:
d_z1=0, d_z2=0, ... , d_zi=1, d_z(i+1)=0, ... , d_zn=0
无论如何,我不知道 R 如何期望看到这些在 data.frame() 定义中为要预测的点命名的假人。
总有一天会有大量的点需要预测
它们的值将一起存储在数据框中。但在这一点上,找到一种方法来预测具有交互作用和 as.factor 的模型中的单个点将是一个很大的进步。
网上有很多涉及 lm() 和 predict() 的例子,但我已经
发现往往不涉及此处提出的调整。
提前致谢。
您没有提供可重现的示例(即允许其他人重现您的错误的数据和代码),但是当我尝试使用内置数据框进行类似操作时我没有遇到问题:
m1 = lm(mpg ~ wt + carb + qsec*hp, data=mtcars)
pred.dat=data.frame(carb=2, hp=120, qsec=10, wt=2.5)
predict(m1, newdata=pred.dat)
1
21.46763
要使用分类变量进行预测,只需提供您想要预测的类别:
m2 = lm(Sepal.Length ~ Petal.Length + Species, data=iris)
pred.dat = data.frame(Petal.Length=1.2, Species="setosa")
predict(m2, newdata=pred.dat)
如果您想要对一组变量(包括 categorical/dummy 个变量)的所有组合进行预测,请使用 expand.grid
生成所有组合:
pred.dat = expand.grid(Petal.Length=1:5, Species=unique(iris$Species))
predict(m2, newdata=pred.dat)
我想根据在 R 中使用 lm() 估计的回归模型计算一些预测值。
要预测的点未包含在用于回归的数据集中-- 尽管我认为它们可能与 NA 一起代表因变量。这在 SAS 中有效,但我不想在这种情况下使用。
下面的简单方法最初很适合我的简单目的。
myLm1 = lm(log(p) ~ u + v + w, data=myDat)
DatToPred1 = data.frame(u=72, v=20, w=85)
predict(myLm1, DatToPred1)
但是假设现在模型规范包括交互 x*y。台词 下面抛出一个错误。
myLm2 = lm(log(p) ~ u + v + w + x*y, data=myDat)
DatToPred2 = data.frame(u=72, v=20, w=85, x=1, y=45)
predict(myLm2, DatToPred2)
Error in data.frame(u=72, v=20, w=85, x=1, y=45, :
argument is missing, with no default
这看起来很奇怪,因为 lm() 可以找到 x 和 y 来形成 x*y,看起来像 predict() 或许可以做同样的事情。
顺便说一句,在 DatToPred2 的定义中包含 x*y 也会失败。
DatToPred2 = data.frame(u=72, v=20, w=85, x*y=45)
最后假设该模型已进一步扩充以包含一整套用于分类变量 z 的虚拟变量。
myLm3 = lm(log(p) ~ u + v + w + x*y + as.factor(z), data=myDat)
我不知道如何指定要估计的点的值。 此外,z 可以取大量 n 个值,并且列出对应于要预测的特定点的虚拟变量的所有值将是乏味的:
d_z1=0, d_z2=0, ... , d_zi=1, d_z(i+1)=0, ... , d_zn=0
无论如何,我不知道 R 如何期望看到这些在 data.frame() 定义中为要预测的点命名的假人。
总有一天会有大量的点需要预测 它们的值将一起存储在数据框中。但在这一点上,找到一种方法来预测具有交互作用和 as.factor 的模型中的单个点将是一个很大的进步。
网上有很多涉及 lm() 和 predict() 的例子,但我已经 发现往往不涉及此处提出的调整。
提前致谢。
您没有提供可重现的示例(即允许其他人重现您的错误的数据和代码),但是当我尝试使用内置数据框进行类似操作时我没有遇到问题:
m1 = lm(mpg ~ wt + carb + qsec*hp, data=mtcars)
pred.dat=data.frame(carb=2, hp=120, qsec=10, wt=2.5)
predict(m1, newdata=pred.dat)
1
21.46763
要使用分类变量进行预测,只需提供您想要预测的类别:
m2 = lm(Sepal.Length ~ Petal.Length + Species, data=iris)
pred.dat = data.frame(Petal.Length=1.2, Species="setosa")
predict(m2, newdata=pred.dat)
如果您想要对一组变量(包括 categorical/dummy 个变量)的所有组合进行预测,请使用 expand.grid
生成所有组合:
pred.dat = expand.grid(Petal.Length=1:5, Species=unique(iris$Species))
predict(m2, newdata=pred.dat)