5

x3独立/説明変数のすべての出現が NA (つまり以下)である場合に、線形回帰で NA を処理する方法についての提案を探しています。

明らかな解決策は、問題の独立/説明変数をモデルから除外することであることはわかっていますが、複数の領域をループしており、領域ごとに異なる機能形式を持たないようにしたいと考えています。

以下はサンプルデータです。

set.seed(23409)
n <- 100

time <- seq(1,n, 1)
x1 <- cumsum(runif(n))           
y  <- .8*x1 + rnorm(n, mean=0, sd=2)
x2 <- seq(1,n, 1)       
x3 <- rep(NA, n)            
df <- data.frame(y=y, time=time, x1=x1, x2=x2, x3=x3)

# Quick plot of data
library(ggplot2)
library(reshape2)
df.melt <-melt(df, id=c("time"))

p <- ggplot(df.melt, aes(x=time, y=value)) + 
  geom_line() + facet_grid(variable ~ .)
p

のドキュメントを読み、さまざまな設定をlm試しましたが成功しませんでした:na.action

lm(y~x1+x2+x3, data=df, singular.ok=TRUE)

lm(y~x1+x2+x3, data=df, na.action=na.omit)
lm(y~x1+x2+x3, data=df, na.action=na.exclude)

lm(y~x1+x2+x3, data=df, singular.ok=TRUE, na.exclude=na.omit)
lm(y~x1+x2+x3, data=df, singular.ok=TRUE, na.exclude=na.exclude)

lm をエラーなしで実行し、問題の変数から説明力の欠如 (つまり、ゼロまたは NA) を反映した説明の係数を返す方法はありますか?

4

2 に答える 2

3

ここに1つのアイデアがあります:

set.seed(23409)
n <- 100

time <- seq(1,n, 1)
x1 <- cumsum(runif(n))           
y  <- .8*x1 + rnorm(n, mean=0, sd=2)
x2 <- seq(1,n, 1)       
x3 <- rep(NA, n)            
df <- data.frame(y=y, time=time, x1=x1, x2=x2, x3=x3)

replaceNA<-function(x){
  if(all(is.na(x))){
    rep(0,length(x)) 
  } else x

} 

lm(y~x1+x2+x3, data= data.frame(lapply(df,replaceNA)))
Call:
lm(formula = y ~ x1 + x2 + x3, data = data.frame(lapply(df, replaceNA)))

Coefficients:
(Intercept)           x1           x2           x3  
    0.05467      1.01133     -0.10613           NA  

lm(y~x1+x2, data=df)
Call:
lm(formula = y ~ x1 + x2, data = df)

Coefficients:
(Intercept)           x1           x2  
    0.05467      1.01133     -0.10613 

NAしたがって、 のみを含む変数を 0 のみを含む変数に置き換えます。係数値 NA を取得しますが、モデル フィットの関連部分はすべて同じです (qr 分解を期待しますが、それに関する情報が必要な場合は、簡単に変更できます)。コンポーネントsummary(fit)$alias(「参考文献」を参照?alias) が役立つ場合があることに注意してください。

これはあなたの他の質問に関連しているようです: [r] の lm 係数を置き換えます

于 2013-03-14T19:53:23.113 に答える
3

NAすべての値を含む列を含めることはできません。それは奇妙なことをしますmodel.matrix

 x1 <- 1:5
 x2 <- rep(NA,5)

 model.matrix(~x1+x2) 
     (Intercept) x1 x2TRUE
attr(,"assign")
[1] 0 1 2
attr(,"contrasts")
attr(,"contrasts")$x2
[1] "contr.treatment"

したがって、代わりに、データに基づいてモデル式をプログラムで作成することもできます。

何かのようなもの...

make_formula <- function(variables, data, response = 'y'){
   if(missing(data)){stop('data not specified')}
   using <-  Filter(variables,f= function(i) !all(is.na(data[[i]])))

   deparse(reformulate(using, response))
 }

 variables <- c('x1','x2','x3')

make_formula(variables, data =df)

[1] "y ~ x1 + x2"

関数内で数式を作成しても問題deparseがないように、以前は文字列を返していました。有効な式である文字列を喜んで受け取ることができます。environmentlm

于 2013-03-14T04:00:43.300 に答える