r中线性回归的数据争论

时间:2018-03-02 11:20:44

标签: r linear-regression

我正在尝试使用lm()函数在r中运行线性回归,但是我得到了各种错误但是我更改了数据。我想看看父母性别,孩子性别和父母分数是否可以预测儿童分数。我的代码是:

mod1 <- lm(score_child ~ score_parent*parent_child*female_male, data=dat, na.action = na.pass)

数据目前看起来像这样:

Subject   Family_number  female_male   parent_child  score_child   score_parent 
1         1               1             0             230           NA
2         1               0             1             NA            400
3         1               0             0             450           NA
4         2               1             1             NA            500
5         2               1             0             500           NA                
.

我知道如果数据是长格式会更容易,但是因为我需要分开孩子和家长,我认为这是最好的方法。 NAs给了我很多的悲伤,我已经尝试了每个na.action命令,但我得到错误,例如lm.fit中的Error(x,y,offset = offset,singular.ok = singular.ok,...) :   “x”中的NA / NaN / Inf。

野兽的方法是改变lm()中的NA命令,更改我的数据的布局,如果是,那么我将如何以及如何在lm()中指定子和父分数?

奖金问题;这些孩子任何父母都是家庭的一部分,我最好分析家庭小组的数据。这是否需要每个家庭一次回归,如果是这样,这不会影响我的自信区间吗?

我的论文和我自己会非常感谢任何帮助!

朱莉娅

1 个答案:

答案 0 :(得分:1)

lm要求每个单元在一行中,而不是分布在两行中。假设每个单元只包含一个父节点和一个子节点,并且每对元素在数据框中的相邻行中相互跟随,使得行1和2形成一个单元,3和4形成一个单元,依此类推可以将父行和子行提取到ParentChild数据帧中。它们具有相同的行数,因此我们可以cbind将它们放在一起并合理化组合数据框的列名,这些列现在将具有nrow(DF)/2行。请注意,下面显示的DF2没有NA值。

Parent <- subset(DF, is.na(score_child))
Child <- subset(DF, is.na(score_parent))
DF2 <- cbind(
 with(Parent, data.frame(subj_parent = Subject, sex_parent = female_male, score_parent)),
 with(Child, data.frame(subj_child = Subject, sex_child = female_male, score_child))
)

lm(score_child ~ score_parent * sex_child * sex_parent, DF2)

DF2看起来像这样:

> DF2
  subject_parent sex_parent score_parent subject_child sex_child score_child
1              2          0          400             1         1         230
2              4          1          500             3         0         450

注意

我们假设输入是可重复的形式:

Lines <- "
Subject   female_male   parent_child  score_child   score_parent
1         1             0             230           NA
2         0             1             NA            400
3         0             0             450           NA
4         1             1             NA            500"
DF <- read.table(text = Lines, header = TRUE)