簡體   English   中英

具有類別和平方連續變量的R lm交互項

[英]R lm interaction terms with categorical and squared continuous variables

我正在嘗試使lm適合我的數據。 我遇到的問題是,當因子為“ true”時,我想擬合線性模型(一階多項式),而當因子為“ false”時,我想擬合二階多項式。 我如何僅使用一個流明就能完成這一工作。

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 

在這里,我都有兩個擬合的I(a ^ 2),我想要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。 我想念的另一件事是沒有處於條件中的I(!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 ***

無論有沒有,我都無法關聯公式! 條件,這對我來說有點奇怪。

嘗試以下方法:

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

嗯...

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

您說“我遇到的問題是,當因子為“ true”時,我想擬合線性模型(一階多項式),而當因子為“ false”時,我想擬合二階多項式。如何使用只有一個流明。”

由此推斷,您不希望b直接出現在模型中? 另外,僅當b為假時,才應包括a ^ 2。

所以那是...

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

如果b為真(即,!b等於FALSE),則將a ^ 2乘以零(FALSE),並從等式中省略。

唯一的問題是您已將b定義為factor而不是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是不必要的。 您可以將所有內容全部放在一行上:

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”)是一個表達式,其結果為“邏輯”(布爾)值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM