2013-04-26 175 views
1

我試圖獲得適合我數據的lm。我遇到的問題是我想在因子爲「真」時擬合線性模型(一階多項式),在因子爲「假」時擬合二階多項式。我怎樣才能完成使用只有一個LM。R lm與分類和平方連續變量的交互作用

a=c(1,2,3,4,5,6,7,8,9,10) 
b=factor(c("true","false","true","false","true","false","true","false","true","false")) 
c=c(10,8,20,15,30,21,40,25,50,31) 
DumbData<-data.frame(cbind(a,c)) 
DumbData<-cbind(DumbData,b=b) 

我已經試過

Lm2<-lm(c~a + b + b*I(a^2), data=DumbData) 
summary(Lm2) 

導致:

summary(Lm2) 
Call: 
lm(formula = c ~ a + b + b * I(a^2), data = DumbData) 

Coefficients: 
      Estimate Std. Error t value Pr(>|t|)  
(Intercept) -0.74483 1.12047 -0.665 0.535640  
a    4.44433 0.39619 11.218 9.83e-05 *** 
btrue   6.78670 0.78299 8.668 0.000338 *** 
I(a^2)  -0.13457 0.03324 -4.049 0.009840 ** 
btrue:I(a^2) 0.18719 0.01620 11.558 8.51e-05 *** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 0.7537 on 5 degrees of freedom 
Multiple R-squared: 0.9982, Adjusted R-squared: 0.9967 
F-statistic: 688 on 4 and 5 DF, p-value: 4.896e-07 

這裏我有我(一^ 2)對於既配合,我想1只月1日爲了和另一個與第二階多項式。 如果有人嘗試:

Lm2<-lm(c~a + b + I(b*I(a^2)), data=DumbData) 
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
    contrasts can be applied only to factors with 2 or more levels 
In addition: Warning message: 
In Ops.factor(b, I(a^2)) : * not meaningful for factors 

我怎樣才能得到適當的互動條款?

謝謝安德烈,我還有一些東西在這裏失蹤。在這個例子中,變量b是邏輯1,如果是兩個級別的因子不起作用,我想我必須將因子變量轉換爲邏輯1。我缺少的另一件事是不在條件中,我(!b * a^2)沒有!我得到:

Call: lm(formula = c ~ a + I(b * a^2), data = dat) 
Coefficients: Estimate Std. Error t value Pr(>|t|) 
(Intercept) 7.2692 1.8425 3.945 0.005565 ** 
a   2.3222 0.3258 7.128 0.000189 *** 
I(b * a^2) 0.3005 0.0355 8.465 6.34e-05 *** 

我不能將公式與有和沒有!條件,這對我來說有點奇怪。

回答

1

嘗試一些大意如下:

dat <- data.frame(
    a=c(1,2,3,4,5,6,7,8,9,10), 
    b=c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE), 
    c=c(10,8,20,15,30,21,40,25,50,31) 
) 

fit <- lm(c ~ a + I(!b * a^2), dat) 
summary(fit) 

這導致:

Call: 
lm(formula = c ~ a + I(!b * a^2), data = dat) 

Residuals: 
    Min  1Q Median  3Q Max 
-4.60 -2.65 0.50 2.65 4.40 

Coefficients: 
       Estimate Std. Error t value Pr(>|t|)  
(Intercept)  10.5000  2.6950 3.896 0.005928 ** 
a     3.9000  0.4209 9.266 3.53e-05 *** 
I(!b * a^2)TRUE -13.9000  2.4178 -5.749 0.000699 *** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 3.764 on 7 degrees of freedom 
Multiple R-squared: 0.9367, Adjusted R-squared: 0.9186 
F-statistic: 51.75 on 2 and 7 DF, p-value: 6.398e-05 

注:

  • 我利用邏輯值TRUEFALSE的。
  • 這些將分別強制爲1和0。
  • 我在公式中使用否定!b
+0

謝謝安德烈,我還有些東西在這裏。在這個例子中,變量b是邏輯1,如果是兩個級別的因子不起作用,我想我必須將因子變量轉換爲邏輯1。我缺少的另一件事是不在條件中,我(!b * a^2)沒有!我得到:電話: lm(公式= c〜a + I(b * a^2),data = dat) 係數: 估計標準。誤差t值Pr(> | t |) (截距)7.2692 1.8425 3.945 0.005565 ** a 2.3222 0.3258 7.128 0.000189 *** I(b * a^2)0.3005 0.0355 8.465 6.34e-05 *** – 2013-04-29 18:28:22

1

嗯...

Lm2<-lm(c~a + b + b*I(a^2), data=DumbData) 

你說,「我遇到的問題是,我想,以適應線性模型(一階多項式)時的因素是‘真’和第二當我使用一個lm,我怎麼能做到這一點?「

從這我推斷你不希望b直接在模型中?另外,只有在b爲假時才應包含^ 2。

因此,這將是...

lm(c~ a + I((!b) * a^2)) 

如果b爲真(即!b等於FALSE),那麼^ 2由零(FALSE)相乘,從方程省略。

唯一的問題是,您已將b定義爲因子而不是logical。這可以治癒。

# b=factor(c("true","false","true","false","true","false","true","false","true","false")) 
# could use TRUE and FALSE instead of "ture" and "false" 
# alternatively, after defining b as above, do 
# b <- b=="true" -- that would convert b to logical (i.e boolean TRUE and FALSe values) 

確定是精確的,則定義B中「字符」,但它被轉換爲「因素」將其添加到所述數據幀(「DumbData」)

關於你的方式另一個小點時定義了數據框。

a=c(1,2,3,4,5,6,7,8,9,10) 
b=factor(c("true","false","true","false","true","false","true","false","true","false")) 
c=c(10,8,20,15,30,21,40,25,50,31) 
DumbData<-data.frame(cbind(a,c)) 
DumbData<-cbind(DumbData,b=b) 

在這裏,cbind是不必要的。你coud擁有一切在同一行:

Dumbdata<- data.frame(a,b,c) 
# shorter and cleaner!! 

此外,與B轉換爲logical使用:

Dumbdata<- data.frame(a,b=b=="true",c) 

注意。你需要說b = b ==「true」,它似乎是多餘的,但是LHS(b)給出了數據框中變量的名字,而RHS(b ==「true」)是一個表達式,邏輯「(布爾)值。