2016-09-01 4 views
0

セグメント化された回帰を使って予測をしようとしましたが、エラー "eval(expr、envir、enclos)のエラー:オブジェクト 'U1.Sepal.Width'が見つかりませんでした。私は間違って何をしていますか?ここでpredict.segmentedのエラー

はサンプルコードです:

library("segmented") 
    data("iris") 
    breaks <- list(Sepal.Width = quantile(iris$Sepal.Width, c(0.25, 0.5, 0.75)), 
        Petal.Width = quantile(iris$Petal.Width, c(0.25, 0.5, 0.75))) 
    fit.lm <- lm(Sepal.Length ~ Sepal.Width + Petal.Width, data = iris) 
    fit.segmented <- segmented(fit.lm, seg.Z = ~ Sepal.Width + Petal.Width, 
           psi = breaks, control = seg.control(it.max = 0)) 
    summary(fit.segmented) 
# 
# Call: 
# lm(formula = Sepal.Length ~ Sepal.Width + Petal.Width + U1.Sepal.Width + 
#  U2.Sepal.Width + U3.Sepal.Width + U1.Petal.Width + U2.Petal.Width + 
#  U3.Petal.Width, data = mfExt) 
# 
# Residuals: 
# Min  1Q Median  3Q  Max 
# -1.25915 -0.25375 -0.02634 0.22621 1.25034 
# 
# Coefficients: 
# Estimate Std. Error t value Pr(>|t|)  
# (Intercept)  3.3287  0.8546 3.895 0.000151 *** 
# Sepal.Width  0.4309  0.3066 1.405 0.162120  
# Petal.Width  0.2362  1.0925 0.216 0.829120  
# U1.Sepal.Width 0.4492  0.8220 0.546 0.585606  
# U2.Sepal.Width -0.7730  0.9027 -0.856 0.393306  
# U3.Sepal.Width 0.8078  0.6080 1.329 0.186139  
# U1.Petal.Width 1.1081  1.2094 0.916 0.361099  
# U2.Petal.Width -0.4990  0.3862 -1.292 0.198400  
# U3.Petal.Width -0.4617  0.4824 -0.957 0.340195  
# --- 
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
# 
# Residual standard error: 0.4381 on 141 degrees of freedom 
# Multiple R-squared: 0.7351, Adjusted R-squared: 0.72 
# F-statistic: 48.9 on 8 and 141 DF, p-value: < 2.2e-16   

    predict(fit.segmented, data.frame("Sepal.Width" = 3, "Petal.Width" = 1.8), se.fit = TRUE) 
#Error in eval(expr, envir, enclos) : object 'U1.Sepal.Width' not found 

答えて

0

あなたが「NEWDATA」オブジェクトに手でU1.xx列を作成する必要があるように見えます。

# new data 
newD <- data.frame("Sepal.Width" = 3, "Petal.Width" = 1.8) 
# function to get breaks 
toBr <- function(name, breaks, values){ cut(values, c(-Inf,breaks,Inf), sprintf("U%s.%s",seq_len(length(breaks)+1)-1,name))} 

# use nnet::class.ind to convert from factor to indicator matrix 
# don't really need U0.xxx but no harm keeping 
list_results <- lapply(Map(toBr, names(newD), breaks, newD), nnet::class.ind) 
# combine with newD and then predict) 
predict(fit.segmented,cbind(newD,do.call(cbind, list_results))) 
+0

残念ながら、コードはあなたがものに比べて(別の近似値を返します提供:

あなたは、あなたがカットを使用することができ、これを行うことができ、しかし

(これは必要とするために奇妙な行動です) 'fit.segmented $ fitted'によって返されます)。 – user4968068

関連する問題