我将以下数据作为示例:
InputName InputValue Output
===================================
Oxide 35 0.4
Oxide 35.2 0.42
Oxide 34.6 0.38
Oxide 35.9 0.46
CD 0.5 0.42
CD 0.48 0.4
CD 0.56 0.429
我想对InputValue
与Output
进行线性回归,将不同的InputName
视为独立的预测因子。
如果我想在R中使用lm(Output ~ Oxide + CD)
,它会为每个预测变量采用单独的列。在上面的示例中,这意味着为Oxide
和CD
创建单独的列。我可以使用cast
包中的plyr
函数执行此操作,该函数可能会在数据中引入NA
s。
但是,有没有办法指示告诉lm
函数输入预测变量是根据列InputName
分组的,而值是在Inputvalue
列中给出的?
答案 0 :(得分:1)
在我看来,你正在描述一种虚拟变量编码。在R中根本不需要这样做,因为数据中的任何因子列都将自动为您编码。
重新创建数据:
dat <- read.table(text="
InputName InputValue Output
Oxide 35 0.4
Oxide 35.2 0.42
Oxide 34.6 0.38
Oxide 35.9 0.46
CD 0.5 0.42
CD 0.48 0.4
CD 0.56 0.429
", header=TRUE)
现在构建你描述的模型,但是删除拦截以使事情变得更加明确:
fit <- lm(Output ~ InputValue + InputName - 1, dat)
summary(fit)
Call:
lm(formula = Output ~ InputValue + InputName - 1, data = dat)
Residuals:
1 2 3 4 5 6 7
-0.003885 0.003412 0.001519 -0.001046 0.004513 -0.014216 0.009703
Coefficients:
Estimate Std. Error t value Pr(>|t|)
InputValue 0.063512 0.009864 6.439 0.00299 **
InputNameCD 0.383731 0.007385 51.962 8.21e-07 ***
InputNameOxide -1.819018 0.346998 -5.242 0.00633 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.009311 on 4 degrees of freedom
Multiple R-squared: 0.9997, Adjusted R-squared: 0.9995
F-statistic: 4662 on 3 and 4 DF, p-value: 1.533e-07
注意InputName的所有因子水平如何出现在输出中,让您单独估计每个级别的效果。
简而言之,您需要的信息包括以下两行:
InputNameCD 0.383731 0.007385 51.962 8.21e-07 ***
InputNameOxide -1.819018 0.346998 -5.242 0.00633 **
答案 1 :(得分:0)
以下是执行此操作的两种方法,split
数据并单独执行回归,或使用交互术语指定您要将不同级别的InputName视为具有单独的斜率:
分割
lapply(split(dat,dat$InputName),lm,formula=Output~InputValue)
$CD
Call:
FUN(formula = ..1, data = X[[1L]])
Coefficients:
(Intercept) InputValue
0.2554 0.3135
$Oxide
Call:
FUN(formula = ..1, data = X[[2L]])
Coefficients:
(Intercept) InputValue
-1.78468 0.06254
相互作用
lm(Output~InputName + InputName:InputValue - 1,dat)
Call:
lm(formula = Output ~ InputName + InputName:InputValue - 1, data = dat)
Coefficients:
InputNameCD InputNameOxide InputNameCD:InputValue InputNameOxide:InputValue
0.25542 -1.78468 0.31346 0.06254
出于比较的目的,我也删除了拦截。请注意,估计的系数在每种情况下都是相同的。