我正在尝试使用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()中指定子和父分数?
奖金问题;这些孩子任何父母都是家庭的一部分,我最好分析家庭小组的数据。这是否需要每个家庭一次回归,如果是这样,这不会影响我的自信区间吗?
我的论文和我自己会非常感谢任何帮助!
朱莉娅
答案 0 :(得分:1)
lm
要求每个单元在一行中,而不是分布在两行中。假设每个单元只包含一个父节点和一个子节点,并且每对元素在数据框中的相邻行中相互跟随,使得行1和2形成一个单元,3和4形成一个单元,依此类推可以将父行和子行提取到Parent
和Child
数据帧中。它们具有相同的行数,因此我们可以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)