单列R线性回归数据

时间:2014-06-12 08:33:07

标签: r linear-regression

我将以下数据作为示例:

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

我想对InputValueOutput进行线性回归,将不同的InputName视为独立的预测因子。

如果我想在R中使用lm(Output ~ Oxide + CD),它会为每个预测变量采用单独的列。在上面的示例中,这意味着为OxideCD创建单独的列。我可以使用cast包中的plyr函数执行此操作,该函数可能会在数据中引入NA s。

但是,有没有办法指示告诉lm函数输入预测变量是根据列InputName分组的,而值是在Inputvalue列中给出的?

2 个答案:

答案 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 

出于比较的目的,我也删除了拦截。请注意,估计的系数在每种情况下都是相同的。