【问题标题】:Using predict.lm based on a model.matrix with different contrasts in R使用基于 R 中具有不同对比度的 model.matrix 的 predict.lm
【发布时间】:2019-10-15 09:49:52
【问题描述】:

目的是根据多元回归模型预测新的观察结果。

该模型包括两个因素(“ec”与效果编码,“dc”与虚拟编码)和一个数字变量(“num”)加上“ec”和“num”的交互项。

但是,基于新数据的 predict.lm 函数失败了。

# Dependent variable 

y <- rnorm(12, 50, 10)

# Independent variables

# Dummy coding

dc <- factor(x=c("Schlecht", "Gut", "Mittel", "Schlecht", "Gut", "Mittel", "Schlecht", "Gut", "Mittel", "Schlecht", "Gut", "Mittel"))

contrasts(dc) <- contr.treatment(3, 1)

# Effect coding

ec <- factor(x=c("A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D"))

contrasts(ec) <- contr.sum(4)

num <- rnorm(12, 10, 2)

# Design matrix

df <- data.frame(dc = dc, ec = ec, num = num)

lm_dm <- model.matrix(~ 1 + ec + dc * num, df)

lm <- lm(y ~ 0 + lm_dm)

# prediction

newdata <- data.frame(dc = c("Schlecht", "Gut", "Gut"), ec = c("C", "D", "B"), num = c(9, 8, 12))

predict.lm(lm, newdata)

如何使用估计的模型进行新的预测?

【问题讨论】:

    标签: r regression lm predict categorical-data


    【解决方案1】:

    问题是模型是使用外部矩阵而不是data 参数估计的。相反,我们可以这样做

    mod <- lm(y ~ 1 + ec + dc * num, data = df)
    predict.lm(mod, newdata)
    #        1        2        3 
    # 24.19016 71.26768 59.50670
    

    坚持不使用它很复杂。例如,您的mod 版本中的变量具有名称lm_dmec1lm_dmdc3,我们需要匹配它们。此外,在整体提供lm_dm 的过程中,我们丢失了ecdc 是因素的信息;因此,我们不能将dcec 用作newdata 中的因素;相反,我们必须为 all 级别设置虚拟变量。因此,最好的选择似乎是手动执行预测:

    model.matrix(~ 1 + ec + dc * num, newdata) %*% coef(mod)
    #       [,1]
    # 1 57.08853
    # 2 31.90847
    # 3 47.81049
    

    【讨论】:

    • 感谢您的回答!这也是我的第一个想法。但我正在明确寻找一种方法来预测与基于外部矩阵的估计相关。
    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    相关资源
    最近更新 更多